hgext/shelve.py
author Boris Feld <boris.feld@octobus.net>
Tue, 29 May 2018 11:47:32 +0200
changeset 39399 da121c9dc0f2
parent 39371 eecd68ca041d
child 39400 6a71324cb68b
permissions -rw-r--r--
shelve: store shelved node in a new data file It is useful for a version of shelve not based on bundle and strip. Having more data does not hurt the bundle based case so we introduce it in all cases before doing more rework. We also keep storing the patch using another method. note: We could have this metadata file list all the file involved in the shelve and use that for cleanup. This would be more future proof than having a hard-coded list of file to purge. However, this is an adventure for another series.
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
36789
ffa3026d4196 cleanup: use stat_result[stat.ST_MTIME] instead of stat_result.st_mtime
Augie Fackler <augie@google.com>
parents: 36636
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
a0939666b836 py3: move up symbol imports to enforce import-checker rules
Yuya Nishihara <yuya@tcha.org>
parents: 28862
diff changeset
    30
from mercurial.i18n import _
28378
96a7368a79b6 shelve: use absolute_import
timeless <timeless@mozdev.org>
parents: 28124
diff changeset
    31
from mercurial import (
31669
1cbeefa59343 shelve: add logic to preserve active bookmarks
Kostia Balytskyi <ikostia@fb.com>
parents: 31561
diff changeset
    32
    bookmarks,
28378
96a7368a79b6 shelve: use absolute_import
timeless <timeless@mozdev.org>
parents: 28124
diff changeset
    33
    bundle2,
96a7368a79b6 shelve: use absolute_import
timeless <timeless@mozdev.org>
parents: 28124
diff changeset
    34
    bundlerepo,
96a7368a79b6 shelve: use absolute_import
timeless <timeless@mozdev.org>
parents: 28124
diff changeset
    35
    changegroup,
96a7368a79b6 shelve: use absolute_import
timeless <timeless@mozdev.org>
parents: 28124
diff changeset
    36
    cmdutil,
34112
f7d41b85bbf6 changegroup: replace changegroupsubset with makechangegroup
Durham Goode <durham@fb.com>
parents: 33440
diff changeset
    37
    discovery,
28378
96a7368a79b6 shelve: use absolute_import
timeless <timeless@mozdev.org>
parents: 28124
diff changeset
    38
    error,
96a7368a79b6 shelve: use absolute_import
timeless <timeless@mozdev.org>
parents: 28124
diff changeset
    39
    exchange,
96a7368a79b6 shelve: use absolute_import
timeless <timeless@mozdev.org>
parents: 28124
diff changeset
    40
    hg,
96a7368a79b6 shelve: use absolute_import
timeless <timeless@mozdev.org>
parents: 28124
diff changeset
    41
    lock as lockmod,
96a7368a79b6 shelve: use absolute_import
timeless <timeless@mozdev.org>
parents: 28124
diff changeset
    42
    mdiff,
96a7368a79b6 shelve: use absolute_import
timeless <timeless@mozdev.org>
parents: 28124
diff changeset
    43
    merge,
38908
ad24b581e4d9 narrow: call narrowspec.{save,restore,clear}backup directly
Martin von Zweigbergk <martinvonz@google.com>
parents: 38823
diff changeset
    44
    narrowspec,
28378
96a7368a79b6 shelve: use absolute_import
timeless <timeless@mozdev.org>
parents: 28124
diff changeset
    45
    node as nodemod,
96a7368a79b6 shelve: use absolute_import
timeless <timeless@mozdev.org>
parents: 28124
diff changeset
    46
    patch,
96a7368a79b6 shelve: use absolute_import
timeless <timeless@mozdev.org>
parents: 28124
diff changeset
    47
    phases,
35046
aad6b9fdfc75 py3: handle keyword arguments in hgext/shelve.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34496
diff changeset
    48
    pycompat,
32376
46ba2cdda476 registrar: move cmdutil.command to registrar module (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32331
diff changeset
    49
    registrar,
28378
96a7368a79b6 shelve: use absolute_import
timeless <timeless@mozdev.org>
parents: 28124
diff changeset
    50
    repair,
96a7368a79b6 shelve: use absolute_import
timeless <timeless@mozdev.org>
parents: 28124
diff changeset
    51
    scmutil,
96a7368a79b6 shelve: use absolute_import
timeless <timeless@mozdev.org>
parents: 28124
diff changeset
    52
    templatefilters,
96a7368a79b6 shelve: use absolute_import
timeless <timeless@mozdev.org>
parents: 28124
diff changeset
    53
    util,
31254
636f55b9ba23 vfs: use 'vfs' module directly in 'hgext.shelve'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31113
diff changeset
    54
    vfs as vfsmod,
28378
96a7368a79b6 shelve: use absolute_import
timeless <timeless@mozdev.org>
parents: 28124
diff changeset
    55
)
96a7368a79b6 shelve: use absolute_import
timeless <timeless@mozdev.org>
parents: 28124
diff changeset
    56
96a7368a79b6 shelve: use absolute_import
timeless <timeless@mozdev.org>
parents: 28124
diff changeset
    57
from . import (
96a7368a79b6 shelve: use absolute_import
timeless <timeless@mozdev.org>
parents: 28124
diff changeset
    58
    rebase,
96a7368a79b6 shelve: use absolute_import
timeless <timeless@mozdev.org>
parents: 28124
diff changeset
    59
)
37087
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36789
diff changeset
    60
from mercurial.utils import (
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36789
diff changeset
    61
    dateutil,
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36789
diff changeset
    62
    stringutil,
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36789
diff changeset
    63
)
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
    64
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
    65
cmdtable = {}
32376
46ba2cdda476 registrar: move cmdutil.command to registrar module (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32331
diff changeset
    66
command = registrar.command(cmdtable)
29852
d5883fd055c6 extensions: change magic "shipped with hg" string
Augie Fackler <augie@google.com>
parents: 29536
diff changeset
    67
# Note for extension authors: ONLY specify testedwith = 'ships-with-hg-core' for
25186
80c5b2666a96 extensions: document that `testedwith = 'internal'` is special
Augie Fackler <augie@google.com>
parents: 25113
diff changeset
    68
# extensions which SHIP WITH MERCURIAL. Non-mainline extensions should
80c5b2666a96 extensions: document that `testedwith = 'internal'` is special
Augie Fackler <augie@google.com>
parents: 25113
diff changeset
    69
# be specifying the version(s) of Mercurial they are tested with, or
80c5b2666a96 extensions: document that `testedwith = 'internal'` is special
Augie Fackler <augie@google.com>
parents: 25113
diff changeset
    70
# leave the attribute unspecified.
29852
d5883fd055c6 extensions: change magic "shipped with hg" string
Augie Fackler <augie@google.com>
parents: 29536
diff changeset
    71
testedwith = 'ships-with-hg-core'
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
    72
34496
18cd210535b3 configitems: register the 'shelve.maxbackups' config
Boris Feld <boris.feld@octobus.net>
parents: 34112
diff changeset
    73
configtable = {}
18cd210535b3 configitems: register the 'shelve.maxbackups' config
Boris Feld <boris.feld@octobus.net>
parents: 34112
diff changeset
    74
configitem = registrar.configitem(configtable)
18cd210535b3 configitems: register the 'shelve.maxbackups' config
Boris Feld <boris.feld@octobus.net>
parents: 34112
diff changeset
    75
18cd210535b3 configitems: register the 'shelve.maxbackups' config
Boris Feld <boris.feld@octobus.net>
parents: 34112
diff changeset
    76
configitem('shelve', 'maxbackups',
18cd210535b3 configitems: register the 'shelve.maxbackups' config
Boris Feld <boris.feld@octobus.net>
parents: 34112
diff changeset
    77
    default=10,
18cd210535b3 configitems: register the 'shelve.maxbackups' config
Boris Feld <boris.feld@octobus.net>
parents: 34112
diff changeset
    78
)
18cd210535b3 configitems: register the 'shelve.maxbackups' config
Boris Feld <boris.feld@octobus.net>
parents: 34112
diff changeset
    79
25713
2ca116614cfc shelve: only keep the latest N shelve backups
Colin Chan <colinchan@fb.com>
parents: 25712
diff changeset
    80
backupdir = 'shelve-backup'
28862
39130afcce60 shelve: refactor directory name into constant
Oleg Afanasyev <olegaf@fb.com>
parents: 28666
diff changeset
    81
shelvedir = 'shelved'
39399
da121c9dc0f2 shelve: store shelved node in a new data file
Boris Feld <boris.feld@octobus.net>
parents: 39371
diff changeset
    82
shelvefileextensions = ['hg', 'patch', 'shelve']
30560
1775975dd439 shelve: move patch extension to a string constant
Kostia Balytskyi <ikostia@fb.com>
parents: 30551
diff changeset
    83
# universal extension is present in all types of shelves
1775975dd439 shelve: move patch extension to a string constant
Kostia Balytskyi <ikostia@fb.com>
parents: 30551
diff changeset
    84
patchextension = 'patch'
25713
2ca116614cfc shelve: only keep the latest N shelve backups
Colin Chan <colinchan@fb.com>
parents: 25712
diff changeset
    85
30391
caba61934721 shelve: move commitfunc creation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30390
diff changeset
    86
# we never need the user, so we use a
caba61934721 shelve: move commitfunc creation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30390
diff changeset
    87
# generic user for all shelve operations
caba61934721 shelve: move commitfunc creation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30390
diff changeset
    88
shelveuser = 'shelve@localhost'
25713
2ca116614cfc shelve: only keep the latest N shelve backups
Colin Chan <colinchan@fb.com>
parents: 25712
diff changeset
    89
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
    90
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
    91
    """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
    92
22581
c5ece02fb211 shelve: avoid writing file that is never read from
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22202
diff changeset
    93
    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
    94
    the vfs layer"""
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
    95
    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
    96
        self.repo = repo
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
    97
        self.name = name
31344
3acc7af5859c shelve: directly use repo.vfs.join
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31321
diff changeset
    98
        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: 31321
diff changeset
    99
        self.backupvfs = vfsmod.vfs(repo.vfs.join(backupdir))
23895
cda18ded2c48 changegroup.writebundle: provide ui
Eric Sumner <ericsumner@fb.com>
parents: 23877
diff changeset
   100
        self.ui = self.repo.ui
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   101
        if filetype:
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   102
            self.fname = name + '.' + filetype
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   103
        else:
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   104
            self.fname = name
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   105
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   106
    def exists(self):
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   107
        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
   108
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   109
    def filename(self):
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   110
        return self.vfs.join(self.fname)
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   111
25712
8a6264a2ee60 shelve: always backup shelves instead of deleting them
Colin Chan <colinchan@fb.com>
parents: 25660
diff changeset
   112
    def backupfilename(self):
8a6264a2ee60 shelve: always backup shelves instead of deleting them
Colin Chan <colinchan@fb.com>
parents: 25660
diff changeset
   113
        def gennames(base):
8a6264a2ee60 shelve: always backup shelves instead of deleting them
Colin Chan <colinchan@fb.com>
parents: 25660
diff changeset
   114
            yield base
8a6264a2ee60 shelve: always backup shelves instead of deleting them
Colin Chan <colinchan@fb.com>
parents: 25660
diff changeset
   115
            base, ext = base.rsplit('.', 1)
8a6264a2ee60 shelve: always backup shelves instead of deleting them
Colin Chan <colinchan@fb.com>
parents: 25660
diff changeset
   116
            for i in itertools.count(1):
8a6264a2ee60 shelve: always backup shelves instead of deleting them
Colin Chan <colinchan@fb.com>
parents: 25660
diff changeset
   117
                yield '%s-%d.%s' % (base, i, ext)
8a6264a2ee60 shelve: always backup shelves instead of deleting them
Colin Chan <colinchan@fb.com>
parents: 25660
diff changeset
   118
8a6264a2ee60 shelve: always backup shelves instead of deleting them
Colin Chan <colinchan@fb.com>
parents: 25660
diff changeset
   119
        name = self.backupvfs.join(self.fname)
8a6264a2ee60 shelve: always backup shelves instead of deleting them
Colin Chan <colinchan@fb.com>
parents: 25660
diff changeset
   120
        for n in gennames(name):
8a6264a2ee60 shelve: always backup shelves instead of deleting them
Colin Chan <colinchan@fb.com>
parents: 25660
diff changeset
   121
            if not self.backupvfs.exists(n):
8a6264a2ee60 shelve: always backup shelves instead of deleting them
Colin Chan <colinchan@fb.com>
parents: 25660
diff changeset
   122
                return n
8a6264a2ee60 shelve: always backup shelves instead of deleting them
Colin Chan <colinchan@fb.com>
parents: 25660
diff changeset
   123
8a6264a2ee60 shelve: always backup shelves instead of deleting them
Colin Chan <colinchan@fb.com>
parents: 25660
diff changeset
   124
    def movetobackup(self):
8a6264a2ee60 shelve: always backup shelves instead of deleting them
Colin Chan <colinchan@fb.com>
parents: 25660
diff changeset
   125
        if not self.backupvfs.isdir():
8a6264a2ee60 shelve: always backup shelves instead of deleting them
Colin Chan <colinchan@fb.com>
parents: 25660
diff changeset
   126
            self.backupvfs.makedir()
8a6264a2ee60 shelve: always backup shelves instead of deleting them
Colin Chan <colinchan@fb.com>
parents: 25660
diff changeset
   127
        util.rename(self.filename(), self.backupfilename())
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   128
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   129
    def stat(self):
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   130
        return self.vfs.stat(self.fname)
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   131
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   132
    def opener(self, mode='rb'):
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   133
        try:
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   134
            return self.vfs(self.fname, mode)
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25260
diff changeset
   135
        except IOError as err:
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   136
            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
   137
                raise
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26577
diff changeset
   138
            raise error.Abort(_("shelved change '%s' not found") % self.name)
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   139
20982
1df99f1ea28d shelve: add "applybundle()" to invoke "readbundle()" with relative path and vfs
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20960
diff changeset
   140
    def applybundle(self):
1df99f1ea28d shelve: add "applybundle()" to invoke "readbundle()" with relative path and vfs
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20960
diff changeset
   141
        fp = self.opener()
1df99f1ea28d shelve: add "applybundle()" to invoke "readbundle()" with relative path and vfs
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20960
diff changeset
   142
        try:
21064
4d9d490d7bbe bundle2: add a ui argument to readbundle
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21063
diff changeset
   143
            gen = exchange.readbundle(self.repo.ui, fp, self.fname, self.vfs)
33055
18c2489ac96d bundle: make applybundle() delegate v1 bundles to applybundle1()
Martin von Zweigbergk <martinvonz@google.com>
parents: 33051
diff changeset
   144
            bundle2.applybundle(self.repo, gen, self.repo.currenttransaction(),
18c2489ac96d bundle: make applybundle() delegate v1 bundles to applybundle1()
Martin von Zweigbergk <martinvonz@google.com>
parents: 33051
diff changeset
   145
                                source='unshelve',
18c2489ac96d bundle: make applybundle() delegate v1 bundles to applybundle1()
Martin von Zweigbergk <martinvonz@google.com>
parents: 33051
diff changeset
   146
                                url='bundle:' + self.vfs.join(self.fname),
18c2489ac96d bundle: make applybundle() delegate v1 bundles to applybundle1()
Martin von Zweigbergk <martinvonz@google.com>
parents: 33051
diff changeset
   147
                                targetphase=phases.secret)
20982
1df99f1ea28d shelve: add "applybundle()" to invoke "readbundle()" with relative path and vfs
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20960
diff changeset
   148
        finally:
1df99f1ea28d shelve: add "applybundle()" to invoke "readbundle()" with relative path and vfs
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20960
diff changeset
   149
            fp.close()
1df99f1ea28d shelve: add "applybundle()" to invoke "readbundle()" with relative path and vfs
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20960
diff changeset
   150
22898
43816070284e shelve: add a bundlerepo method
Matt Mackall <mpm@selenic.com>
parents: 22844
diff changeset
   151
    def bundlerepo(self):
43816070284e shelve: add a bundlerepo method
Matt Mackall <mpm@selenic.com>
parents: 22844
diff changeset
   152
        return bundlerepo.bundlerepository(self.repo.baseui, self.repo.root,
43816070284e shelve: add a bundlerepo method
Matt Mackall <mpm@selenic.com>
parents: 22844
diff changeset
   153
                                           self.vfs.join(self.fname))
26506
edecf059fda6 shelve: move changegroup generation inside writebundle
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26505
diff changeset
   154
    def writebundle(self, bases, node):
27931
1289a122cf3f shelve: use cg3 for treemanifests
Martin von Zweigbergk <martinvonz@google.com>
parents: 27921
diff changeset
   155
        cgversion = changegroup.safeversion(self.repo)
1289a122cf3f shelve: use cg3 for treemanifests
Martin von Zweigbergk <martinvonz@google.com>
parents: 27921
diff changeset
   156
        if cgversion == '01':
1289a122cf3f shelve: use cg3 for treemanifests
Martin von Zweigbergk <martinvonz@google.com>
parents: 27921
diff changeset
   157
            btype = 'HG10BZ'
1289a122cf3f shelve: use cg3 for treemanifests
Martin von Zweigbergk <martinvonz@google.com>
parents: 27921
diff changeset
   158
            compression = None
1289a122cf3f shelve: use cg3 for treemanifests
Martin von Zweigbergk <martinvonz@google.com>
parents: 27921
diff changeset
   159
        else:
26507
ae29cffa05db shelve: bundle using bundle2 if repository is general delta (issue4862)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26506
diff changeset
   160
            btype = 'HG20'
ae29cffa05db shelve: bundle using bundle2 if repository is general delta (issue4862)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26506
diff changeset
   161
            compression = 'BZ'
ae29cffa05db shelve: bundle using bundle2 if repository is general delta (issue4862)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26506
diff changeset
   162
34112
f7d41b85bbf6 changegroup: replace changegroupsubset with makechangegroup
Durham Goode <durham@fb.com>
parents: 33440
diff changeset
   163
        outgoing = discovery.outgoing(self.repo, missingroots=bases,
f7d41b85bbf6 changegroup: replace changegroupsubset with makechangegroup
Durham Goode <durham@fb.com>
parents: 33440
diff changeset
   164
                                      missingheads=[node])
f7d41b85bbf6 changegroup: replace changegroupsubset with makechangegroup
Durham Goode <durham@fb.com>
parents: 33440
diff changeset
   165
        cg = changegroup.makechangegroup(self.repo, outgoing, cgversion,
f7d41b85bbf6 changegroup: replace changegroupsubset with makechangegroup
Durham Goode <durham@fb.com>
parents: 33440
diff changeset
   166
                                         'shelve')
f7d41b85bbf6 changegroup: replace changegroupsubset with makechangegroup
Durham Goode <durham@fb.com>
parents: 33440
diff changeset
   167
28666
ae53ecc47414 bundle: move writebundle() from changegroup.py to bundle2.py (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 28573
diff changeset
   168
        bundle2.writebundle(self.ui, cg, self.fname, btype, self.vfs,
26507
ae29cffa05db shelve: bundle using bundle2 if repository is general delta (issue4862)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26506
diff changeset
   169
                                compression=compression)
20983
2778616de7ce shelve: add "writebundle()" to invoke "writebundle()" with relative path and vfs
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20982
diff changeset
   170
39370
bab58b1d87c7 shelve: rename method for data write/read
Boris Feld <boris.feld@octobus.net>
parents: 39369
diff changeset
   171
    def writeinfo(self, info):
31560
7485e45807e4 shelve: add an ability to write key-val data to a new type of shelve files
Kostia Balytskyi <ikostia@fb.com>
parents: 31549
diff changeset
   172
        scmutil.simplekeyvaluefile(self.vfs, self.fname).write(info)
7485e45807e4 shelve: add an ability to write key-val data to a new type of shelve files
Kostia Balytskyi <ikostia@fb.com>
parents: 31549
diff changeset
   173
39370
bab58b1d87c7 shelve: rename method for data write/read
Boris Feld <boris.feld@octobus.net>
parents: 39369
diff changeset
   174
    def readinfo(self):
31560
7485e45807e4 shelve: add an ability to write key-val data to a new type of shelve files
Kostia Balytskyi <ikostia@fb.com>
parents: 31549
diff changeset
   175
        return scmutil.simplekeyvaluefile(self.vfs, self.fname).read()
7485e45807e4 shelve: add an ability to write key-val data to a new type of shelve files
Kostia Balytskyi <ikostia@fb.com>
parents: 31549
diff changeset
   176
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   177
class shelvedstate(object):
19911
1c58e368fbfd shelve: some docstring cleanups
Augie Fackler <raf@durin42.com>
parents: 19909
diff changeset
   178
    """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
   179
df54786a3203 shelve: add minimal documentation to all functions
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19908
diff changeset
   180
    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
   181
    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
   182
    """
32325
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32324
diff changeset
   183
    _version = 2
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   184
    _filename = 'shelvedstate'
30531
7b3136bc7bfd shelve: make --keep option survive user intervention (issue5431)
Kostia Balytskyi <ikostia@fb.com>
parents: 30466
diff changeset
   185
    _keep = 'keep'
7b3136bc7bfd shelve: make --keep option survive user intervention (issue5431)
Kostia Balytskyi <ikostia@fb.com>
parents: 30466
diff changeset
   186
    _nokeep = 'nokeep'
31669
1cbeefa59343 shelve: add logic to preserve active bookmarks
Kostia Balytskyi <ikostia@fb.com>
parents: 31561
diff changeset
   187
    # colon is essential to differentiate from a real bookmark name
1cbeefa59343 shelve: add logic to preserve active bookmarks
Kostia Balytskyi <ikostia@fb.com>
parents: 31561
diff changeset
   188
    _noactivebook = ':no-active-bookmark'
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   189
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   190
    @classmethod
32325
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32324
diff changeset
   191
    def _verifyandtransform(cls, d):
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32324
diff changeset
   192
        """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
   193
        try:
32324
16d424b97125 shelve: refactor shelvestate loading
Kostia Balytskyi <ikostia@fb.com>
parents: 31888
diff changeset
   194
            d['originalwctx'] = nodemod.bin(d['originalwctx'])
16d424b97125 shelve: refactor shelvestate loading
Kostia Balytskyi <ikostia@fb.com>
parents: 31888
diff changeset
   195
            d['pendingctx'] = nodemod.bin(d['pendingctx'])
16d424b97125 shelve: refactor shelvestate loading
Kostia Balytskyi <ikostia@fb.com>
parents: 31888
diff changeset
   196
            d['parents'] = [nodemod.bin(h)
16d424b97125 shelve: refactor shelvestate loading
Kostia Balytskyi <ikostia@fb.com>
parents: 31888
diff changeset
   197
                            for h in d['parents'].split(' ')]
16d424b97125 shelve: refactor shelvestate loading
Kostia Balytskyi <ikostia@fb.com>
parents: 31888
diff changeset
   198
            d['nodestoremove'] = [nodemod.bin(h)
16d424b97125 shelve: refactor shelvestate loading
Kostia Balytskyi <ikostia@fb.com>
parents: 31888
diff changeset
   199
                                  for h in d['nodestoremove'].split(' ')]
16d424b97125 shelve: refactor shelvestate loading
Kostia Balytskyi <ikostia@fb.com>
parents: 31888
diff changeset
   200
        except (ValueError, TypeError, KeyError) as err:
36526
7af7443877da py3: replace str() with it's bytes equivalent in hgext/shelve.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 36223
diff changeset
   201
            raise error.CorruptedState(pycompat.bytestr(err))
32324
16d424b97125 shelve: refactor shelvestate loading
Kostia Balytskyi <ikostia@fb.com>
parents: 31888
diff changeset
   202
32325
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32324
diff changeset
   203
    @classmethod
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32324
diff changeset
   204
    def _getversion(cls, repo):
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32324
diff changeset
   205
        """Read version information from shelvestate file"""
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32324
diff changeset
   206
        fp = repo.vfs(cls._filename)
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32324
diff changeset
   207
        try:
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32324
diff changeset
   208
            version = int(fp.readline().strip())
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32324
diff changeset
   209
        except ValueError as err:
36526
7af7443877da py3: replace str() with it's bytes equivalent in hgext/shelve.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 36223
diff changeset
   210
            raise error.CorruptedState(pycompat.bytestr(err))
32325
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32324
diff changeset
   211
        finally:
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32324
diff changeset
   212
            fp.close()
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32324
diff changeset
   213
        return version
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32324
diff changeset
   214
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32324
diff changeset
   215
    @classmethod
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32324
diff changeset
   216
    def _readold(cls, repo):
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32324
diff changeset
   217
        """Read the old position-based version of a shelvestate file"""
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32324
diff changeset
   218
        # Order is important, because old shelvestate file uses it
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32324
diff changeset
   219
        # 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: 32324
diff changeset
   220
        # originalwctx is on the third and so forth). Please do not change.
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32324
diff changeset
   221
        keys = ['version', 'name', 'originalwctx', 'pendingctx', 'parents',
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32324
diff changeset
   222
                'nodestoremove', 'branchtorestore', 'keep', 'activebook']
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32324
diff changeset
   223
        # this is executed only seldomly, so it is not a big deal
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32324
diff changeset
   224
        # that we open this file twice
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32324
diff changeset
   225
        fp = repo.vfs(cls._filename)
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32324
diff changeset
   226
        d = {}
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32324
diff changeset
   227
        try:
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32324
diff changeset
   228
            for key in keys:
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32324
diff changeset
   229
                d[key] = fp.readline().strip()
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32324
diff changeset
   230
        finally:
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32324
diff changeset
   231
            fp.close()
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32324
diff changeset
   232
        return d
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32324
diff changeset
   233
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32324
diff changeset
   234
    @classmethod
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32324
diff changeset
   235
    def load(cls, repo):
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32324
diff changeset
   236
        version = cls._getversion(repo)
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32324
diff changeset
   237
        if version < cls._version:
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32324
diff changeset
   238
            d = cls._readold(repo)
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32324
diff changeset
   239
        elif version == cls._version:
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32324
diff changeset
   240
            d = scmutil.simplekeyvaluefile(repo.vfs, cls._filename)\
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32324
diff changeset
   241
                       .read(firstlinenonkeyval=True)
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32324
diff changeset
   242
        else:
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32324
diff changeset
   243
            raise error.Abort(_('this version of shelve is incompatible '
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32324
diff changeset
   244
                                'with the version used in this repo'))
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32324
diff changeset
   245
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32324
diff changeset
   246
        cls._verifyandtransform(d)
29536
b17a6e3cd2ac shelve: make unshelve be able to abort in any case
Kostia Balytskyi <ikostia@fb.com>
parents: 29270
diff changeset
   247
        try:
b17a6e3cd2ac shelve: make unshelve be able to abort in any case
Kostia Balytskyi <ikostia@fb.com>
parents: 29270
diff changeset
   248
            obj = cls()
32324
16d424b97125 shelve: refactor shelvestate loading
Kostia Balytskyi <ikostia@fb.com>
parents: 31888
diff changeset
   249
            obj.name = d['name']
16d424b97125 shelve: refactor shelvestate loading
Kostia Balytskyi <ikostia@fb.com>
parents: 31888
diff changeset
   250
            obj.wctx = repo[d['originalwctx']]
16d424b97125 shelve: refactor shelvestate loading
Kostia Balytskyi <ikostia@fb.com>
parents: 31888
diff changeset
   251
            obj.pendingctx = repo[d['pendingctx']]
16d424b97125 shelve: refactor shelvestate loading
Kostia Balytskyi <ikostia@fb.com>
parents: 31888
diff changeset
   252
            obj.parents = d['parents']
16d424b97125 shelve: refactor shelvestate loading
Kostia Balytskyi <ikostia@fb.com>
parents: 31888
diff changeset
   253
            obj.nodestoremove = d['nodestoremove']
16d424b97125 shelve: refactor shelvestate loading
Kostia Balytskyi <ikostia@fb.com>
parents: 31888
diff changeset
   254
            obj.branchtorestore = d.get('branchtorestore', '')
16d424b97125 shelve: refactor shelvestate loading
Kostia Balytskyi <ikostia@fb.com>
parents: 31888
diff changeset
   255
            obj.keep = d.get('keep') == cls._keep
31669
1cbeefa59343 shelve: add logic to preserve active bookmarks
Kostia Balytskyi <ikostia@fb.com>
parents: 31561
diff changeset
   256
            obj.activebookmark = ''
32324
16d424b97125 shelve: refactor shelvestate loading
Kostia Balytskyi <ikostia@fb.com>
parents: 31888
diff changeset
   257
            if d.get('activebook', '') != cls._noactivebook:
16d424b97125 shelve: refactor shelvestate loading
Kostia Balytskyi <ikostia@fb.com>
parents: 31888
diff changeset
   258
                obj.activebookmark = d.get('activebook', '')
16d424b97125 shelve: refactor shelvestate loading
Kostia Balytskyi <ikostia@fb.com>
parents: 31888
diff changeset
   259
        except (error.RepoLookupError, KeyError) as err:
36526
7af7443877da py3: replace str() with it's bytes equivalent in hgext/shelve.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 36223
diff changeset
   260
            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
   261
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   262
        return obj
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   263
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   264
    @classmethod
31888
1c398f7f4aa4 shelve: rename nodestoprune to nodestoremove
Kostia Balytskyi <ikostia@fb.com>
parents: 31762
diff changeset
   265
    def save(cls, repo, name, originalwctx, pendingctx, nodestoremove,
31669
1cbeefa59343 shelve: add logic to preserve active bookmarks
Kostia Balytskyi <ikostia@fb.com>
parents: 31561
diff changeset
   266
             branchtorestore, keep=False, activebook=''):
32325
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32324
diff changeset
   267
        info = {
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32324
diff changeset
   268
            "name": name,
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32324
diff changeset
   269
            "originalwctx": nodemod.hex(originalwctx.node()),
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32324
diff changeset
   270
            "pendingctx": nodemod.hex(pendingctx.node()),
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32324
diff changeset
   271
            "parents": ' '.join([nodemod.hex(p)
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32324
diff changeset
   272
                                 for p in repo.dirstate.parents()]),
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32324
diff changeset
   273
            "nodestoremove": ' '.join([nodemod.hex(n)
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32324
diff changeset
   274
                                      for n in nodestoremove]),
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32324
diff changeset
   275
            "branchtorestore": branchtorestore,
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32324
diff changeset
   276
            "keep": cls._keep if keep else cls._nokeep,
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32324
diff changeset
   277
            "activebook": activebook or cls._noactivebook
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32324
diff changeset
   278
        }
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32324
diff changeset
   279
        scmutil.simplekeyvaluefile(repo.vfs, cls._filename)\
36223
acc8e6e52af6 py3: use "%d" to convert integers to bytes
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35952
diff changeset
   280
               .write(info, firstline=("%d" % cls._version))
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   281
19908
07ee5c8867ca shelve: use the class constant in the clear method
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19904
diff changeset
   282
    @classmethod
07ee5c8867ca shelve: use the class constant in the clear method
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19904
diff changeset
   283
    def clear(cls, repo):
31320
f59b6cf663a9 vfs: use repo.vfs.unlinkpath
Mads Kiilerich <mads@kiilerich.com>
parents: 31254
diff changeset
   284
        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
   285
25713
2ca116614cfc shelve: only keep the latest N shelve backups
Colin Chan <colinchan@fb.com>
parents: 25712
diff changeset
   286
def cleanupoldbackups(repo):
31344
3acc7af5859c shelve: directly use repo.vfs.join
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31321
diff changeset
   287
    vfs = vfsmod.vfs(repo.vfs.join(backupdir))
34496
18cd210535b3 configitems: register the 'shelve.maxbackups' config
Boris Feld <boris.feld@octobus.net>
parents: 34112
diff changeset
   288
    maxbackups = repo.ui.configint('shelve', 'maxbackups')
30560
1775975dd439 shelve: move patch extension to a string constant
Kostia Balytskyi <ikostia@fb.com>
parents: 30551
diff changeset
   289
    hgfiles = [f for f in vfs.listdir()
1775975dd439 shelve: move patch extension to a string constant
Kostia Balytskyi <ikostia@fb.com>
parents: 30551
diff changeset
   290
               if f.endswith('.' + patchextension)]
36789
ffa3026d4196 cleanup: use stat_result[stat.ST_MTIME] instead of stat_result.st_mtime
Augie Fackler <augie@google.com>
parents: 36636
diff changeset
   291
    hgfiles = sorted([(vfs.stat(f)[stat.ST_MTIME], f) for f in 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
   292
    if 0 < maxbackups and maxbackups < len(hgfiles):
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
   293
        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
   294
    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
   295
        bordermtime = None
25713
2ca116614cfc shelve: only keep the latest N shelve backups
Colin Chan <colinchan@fb.com>
parents: 25712
diff changeset
   296
    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
   297
        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
   298
            # 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
   299
            continue
30560
1775975dd439 shelve: move patch extension to a string constant
Kostia Balytskyi <ikostia@fb.com>
parents: 30551
diff changeset
   300
        base = f[:-(1 + len(patchextension))]
30388
c5126aab9c37 shelve: move possible shelve file extensions to a single place
Kostia Balytskyi <ikostia@fb.com>
parents: 29852
diff changeset
   301
        for ext in shelvefileextensions:
31549
d5758760c0f4 shelve: use tryunlink
Ryan McElroy <rmcelroy@fb.com>
parents: 31471
diff changeset
   302
            vfs.tryunlink(base + '.' + ext)
25713
2ca116614cfc shelve: only keep the latest N shelve backups
Colin Chan <colinchan@fb.com>
parents: 25712
diff changeset
   303
31669
1cbeefa59343 shelve: add logic to preserve active bookmarks
Kostia Balytskyi <ikostia@fb.com>
parents: 31561
diff changeset
   304
def _backupactivebookmark(repo):
1cbeefa59343 shelve: add logic to preserve active bookmarks
Kostia Balytskyi <ikostia@fb.com>
parents: 31561
diff changeset
   305
    activebookmark = repo._activebookmark
1cbeefa59343 shelve: add logic to preserve active bookmarks
Kostia Balytskyi <ikostia@fb.com>
parents: 31561
diff changeset
   306
    if activebookmark:
1cbeefa59343 shelve: add logic to preserve active bookmarks
Kostia Balytskyi <ikostia@fb.com>
parents: 31561
diff changeset
   307
        bookmarks.deactivate(repo)
1cbeefa59343 shelve: add logic to preserve active bookmarks
Kostia Balytskyi <ikostia@fb.com>
parents: 31561
diff changeset
   308
    return activebookmark
1cbeefa59343 shelve: add logic to preserve active bookmarks
Kostia Balytskyi <ikostia@fb.com>
parents: 31561
diff changeset
   309
1cbeefa59343 shelve: add logic to preserve active bookmarks
Kostia Balytskyi <ikostia@fb.com>
parents: 31561
diff changeset
   310
def _restoreactivebookmark(repo, mark):
1cbeefa59343 shelve: add logic to preserve active bookmarks
Kostia Balytskyi <ikostia@fb.com>
parents: 31561
diff changeset
   311
    if mark:
1cbeefa59343 shelve: add logic to preserve active bookmarks
Kostia Balytskyi <ikostia@fb.com>
parents: 31561
diff changeset
   312
        bookmarks.activate(repo, mark)
1cbeefa59343 shelve: add logic to preserve active bookmarks
Kostia Balytskyi <ikostia@fb.com>
parents: 31561
diff changeset
   313
26522
10f14bb22950 shelve: add utility to abort current transaction but keep dirstate
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26520
diff changeset
   314
def _aborttransaction(repo):
10f14bb22950 shelve: add utility to abort current transaction but keep dirstate
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26520
diff changeset
   315
    '''Abort current transaction for shelve/unshelve, but keep dirstate
10f14bb22950 shelve: add utility to abort current transaction but keep dirstate
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26520
diff changeset
   316
    '''
29270
48b38b16a8f8 shelve: use backup functions instead of manually copying dirstate
Mateusz Kwapich <mitrandir@fb.com>
parents: 29205
diff changeset
   317
    tr = repo.currenttransaction()
38908
ad24b581e4d9 narrow: call narrowspec.{save,restore,clear}backup directly
Martin von Zweigbergk <martinvonz@google.com>
parents: 38823
diff changeset
   318
    dirstatebackupname = 'dirstate.shelve'
ad24b581e4d9 narrow: call narrowspec.{save,restore,clear}backup directly
Martin von Zweigbergk <martinvonz@google.com>
parents: 38823
diff changeset
   319
    narrowspecbackupname = 'narrowspec.shelve'
ad24b581e4d9 narrow: call narrowspec.{save,restore,clear}backup directly
Martin von Zweigbergk <martinvonz@google.com>
parents: 38823
diff changeset
   320
    repo.dirstate.savebackup(tr, dirstatebackupname)
ad24b581e4d9 narrow: call narrowspec.{save,restore,clear}backup directly
Martin von Zweigbergk <martinvonz@google.com>
parents: 38823
diff changeset
   321
    narrowspec.savebackup(repo, narrowspecbackupname)
29270
48b38b16a8f8 shelve: use backup functions instead of manually copying dirstate
Mateusz Kwapich <mitrandir@fb.com>
parents: 29205
diff changeset
   322
    tr.abort()
38908
ad24b581e4d9 narrow: call narrowspec.{save,restore,clear}backup directly
Martin von Zweigbergk <martinvonz@google.com>
parents: 38823
diff changeset
   323
    narrowspec.restorebackup(repo, narrowspecbackupname)
ad24b581e4d9 narrow: call narrowspec.{save,restore,clear}backup directly
Martin von Zweigbergk <martinvonz@google.com>
parents: 38823
diff changeset
   324
    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
   325
30389
684068d24658 shelve: move shelve name generation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30388
diff changeset
   326
def getshelvename(repo, parent, opts):
684068d24658 shelve: move shelve name generation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30388
diff changeset
   327
    """Decide on the name this shelve is going to have"""
684068d24658 shelve: move shelve name generation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30388
diff changeset
   328
    def gennames():
684068d24658 shelve: move shelve name generation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30388
diff changeset
   329
        yield label
32986
4107eb8a5648 shelve: allow unlimited shelved changes per name
Jun Wu <quark@fb.com>
parents: 32948
diff changeset
   330
        for i in itertools.count(1):
30389
684068d24658 shelve: move shelve name generation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30388
diff changeset
   331
            yield '%s-%02d' % (label, i)
684068d24658 shelve: move shelve name generation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30388
diff changeset
   332
    name = opts.get('name')
684068d24658 shelve: move shelve name generation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30388
diff changeset
   333
    label = repo._activebookmark or parent.branch() or 'default'
684068d24658 shelve: move shelve name generation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30388
diff changeset
   334
    # slashes aren't allowed in filenames, therefore we rename it
684068d24658 shelve: move shelve name generation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30388
diff changeset
   335
    label = label.replace('/', '_')
30674
64a75655b988 shelve: choose a legal shelve name when no name is passed (issue5112)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30560
diff changeset
   336
    label = label.replace('\\', '_')
64a75655b988 shelve: choose a legal shelve name when no name is passed (issue5112)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30560
diff changeset
   337
    # filenames must not start with '.' as it should not be hidden
64a75655b988 shelve: choose a legal shelve name when no name is passed (issue5112)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30560
diff changeset
   338
    if label.startswith('.'):
64a75655b988 shelve: choose a legal shelve name when no name is passed (issue5112)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30560
diff changeset
   339
        label = label.replace('.', '_', 1)
30389
684068d24658 shelve: move shelve name generation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30388
diff changeset
   340
684068d24658 shelve: move shelve name generation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30388
diff changeset
   341
    if name:
30560
1775975dd439 shelve: move patch extension to a string constant
Kostia Balytskyi <ikostia@fb.com>
parents: 30551
diff changeset
   342
        if shelvedfile(repo, name, patchextension).exists():
30389
684068d24658 shelve: move shelve name generation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30388
diff changeset
   343
            e = _("a shelved change named '%s' already exists") % name
684068d24658 shelve: move shelve name generation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30388
diff changeset
   344
            raise error.Abort(e)
30674
64a75655b988 shelve: choose a legal shelve name when no name is passed (issue5112)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30560
diff changeset
   345
64a75655b988 shelve: choose a legal shelve name when no name is passed (issue5112)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30560
diff changeset
   346
        # ensure we are not creating a subdirectory or a hidden file
64a75655b988 shelve: choose a legal shelve name when no name is passed (issue5112)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30560
diff changeset
   347
        if '/' in name or '\\' in name:
64a75655b988 shelve: choose a legal shelve name when no name is passed (issue5112)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30560
diff changeset
   348
            raise error.Abort(_('shelved change names can not contain slashes'))
64a75655b988 shelve: choose a legal shelve name when no name is passed (issue5112)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30560
diff changeset
   349
        if name.startswith('.'):
64a75655b988 shelve: choose a legal shelve name when no name is passed (issue5112)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30560
diff changeset
   350
            raise error.Abort(_("shelved change names can not start with '.'"))
64a75655b988 shelve: choose a legal shelve name when no name is passed (issue5112)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30560
diff changeset
   351
30389
684068d24658 shelve: move shelve name generation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30388
diff changeset
   352
    else:
684068d24658 shelve: move shelve name generation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30388
diff changeset
   353
        for n in gennames():
30560
1775975dd439 shelve: move patch extension to a string constant
Kostia Balytskyi <ikostia@fb.com>
parents: 30551
diff changeset
   354
            if not shelvedfile(repo, n, patchextension).exists():
30389
684068d24658 shelve: move shelve name generation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30388
diff changeset
   355
                name = n
684068d24658 shelve: move shelve name generation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30388
diff changeset
   356
                break
684068d24658 shelve: move shelve name generation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30388
diff changeset
   357
684068d24658 shelve: move shelve name generation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30388
diff changeset
   358
    return name
684068d24658 shelve: move shelve name generation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30388
diff changeset
   359
30390
84e8cbdbdee4 shelve: move mutableancestors to not be a closure
Kostia Balytskyi <ikostia@fb.com>
parents: 30389
diff changeset
   360
def mutableancestors(ctx):
84e8cbdbdee4 shelve: move mutableancestors to not be a closure
Kostia Balytskyi <ikostia@fb.com>
parents: 30389
diff changeset
   361
    """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
   362
30390
84e8cbdbdee4 shelve: move mutableancestors to not be a closure
Kostia Balytskyi <ikostia@fb.com>
parents: 30389
diff changeset
   363
    Much faster than the revset ancestors(ctx) & draft()"""
32331
bd872f64a8ba cleanup: use set literals
Martin von Zweigbergk <martinvonz@google.com>
parents: 32325
diff changeset
   364
    seen = {nodemod.nullrev}
30390
84e8cbdbdee4 shelve: move mutableancestors to not be a closure
Kostia Balytskyi <ikostia@fb.com>
parents: 30389
diff changeset
   365
    visit = collections.deque()
84e8cbdbdee4 shelve: move mutableancestors to not be a closure
Kostia Balytskyi <ikostia@fb.com>
parents: 30389
diff changeset
   366
    visit.append(ctx)
84e8cbdbdee4 shelve: move mutableancestors to not be a closure
Kostia Balytskyi <ikostia@fb.com>
parents: 30389
diff changeset
   367
    while visit:
84e8cbdbdee4 shelve: move mutableancestors to not be a closure
Kostia Balytskyi <ikostia@fb.com>
parents: 30389
diff changeset
   368
        ctx = visit.popleft()
84e8cbdbdee4 shelve: move mutableancestors to not be a closure
Kostia Balytskyi <ikostia@fb.com>
parents: 30389
diff changeset
   369
        yield ctx.node()
84e8cbdbdee4 shelve: move mutableancestors to not be a closure
Kostia Balytskyi <ikostia@fb.com>
parents: 30389
diff changeset
   370
        for parent in ctx.parents():
84e8cbdbdee4 shelve: move mutableancestors to not be a closure
Kostia Balytskyi <ikostia@fb.com>
parents: 30389
diff changeset
   371
            rev = parent.rev()
84e8cbdbdee4 shelve: move mutableancestors to not be a closure
Kostia Balytskyi <ikostia@fb.com>
parents: 30389
diff changeset
   372
            if rev not in seen:
84e8cbdbdee4 shelve: move mutableancestors to not be a closure
Kostia Balytskyi <ikostia@fb.com>
parents: 30389
diff changeset
   373
                seen.add(rev)
84e8cbdbdee4 shelve: move mutableancestors to not be a closure
Kostia Balytskyi <ikostia@fb.com>
parents: 30389
diff changeset
   374
                if parent.mutable():
84e8cbdbdee4 shelve: move mutableancestors to not be a closure
Kostia Balytskyi <ikostia@fb.com>
parents: 30389
diff changeset
   375
                    visit.append(parent)
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   376
30391
caba61934721 shelve: move commitfunc creation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30390
diff changeset
   377
def getcommitfunc(extra, interactive, editor=False):
caba61934721 shelve: move commitfunc creation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30390
diff changeset
   378
    def commitfunc(ui, repo, message, match, opts):
caba61934721 shelve: move commitfunc creation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30390
diff changeset
   379
        hasmq = util.safehasattr(repo, 'mq')
caba61934721 shelve: move commitfunc creation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30390
diff changeset
   380
        if hasmq:
caba61934721 shelve: move commitfunc creation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30390
diff changeset
   381
            saved, repo.mq.checkapplied = repo.mq.checkapplied, False
31471
d1ce2124ec83 shelve: get rid of ui.backupconfig
Jun Wu <quark@fb.com>
parents: 31344
diff changeset
   382
        overrides = {('phases', 'new-commit'): phases.secret}
30391
caba61934721 shelve: move commitfunc creation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30390
diff changeset
   383
        try:
caba61934721 shelve: move commitfunc creation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30390
diff changeset
   384
            editor_ = False
caba61934721 shelve: move commitfunc creation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30390
diff changeset
   385
            if editor:
caba61934721 shelve: move commitfunc creation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30390
diff changeset
   386
                editor_ = cmdutil.getcommiteditor(editform='shelve.shelve',
35046
aad6b9fdfc75 py3: handle keyword arguments in hgext/shelve.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34496
diff changeset
   387
                                                  **pycompat.strkwargs(opts))
31471
d1ce2124ec83 shelve: get rid of ui.backupconfig
Jun Wu <quark@fb.com>
parents: 31344
diff changeset
   388
            with repo.ui.configoverride(overrides):
d1ce2124ec83 shelve: get rid of ui.backupconfig
Jun Wu <quark@fb.com>
parents: 31344
diff changeset
   389
                return repo.commit(message, shelveuser, opts.get('date'),
d1ce2124ec83 shelve: get rid of ui.backupconfig
Jun Wu <quark@fb.com>
parents: 31344
diff changeset
   390
                                   match, editor=editor_, extra=extra)
30391
caba61934721 shelve: move commitfunc creation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30390
diff changeset
   391
        finally:
caba61934721 shelve: move commitfunc creation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30390
diff changeset
   392
            if hasmq:
caba61934721 shelve: move commitfunc creation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30390
diff changeset
   393
                repo.mq.checkapplied = saved
caba61934721 shelve: move commitfunc creation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30390
diff changeset
   394
caba61934721 shelve: move commitfunc creation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30390
diff changeset
   395
    def interactivecommitfunc(ui, repo, *pats, **opts):
35046
aad6b9fdfc75 py3: handle keyword arguments in hgext/shelve.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34496
diff changeset
   396
        opts = pycompat.byteskwargs(opts)
30391
caba61934721 shelve: move commitfunc creation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30390
diff changeset
   397
        match = scmutil.match(repo['.'], pats, {})
caba61934721 shelve: move commitfunc creation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30390
diff changeset
   398
        message = opts['message']
caba61934721 shelve: move commitfunc creation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30390
diff changeset
   399
        return commitfunc(ui, repo, message, match, opts)
caba61934721 shelve: move commitfunc creation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30390
diff changeset
   400
caba61934721 shelve: move commitfunc creation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30390
diff changeset
   401
    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
   402
30392
dedf0915ca5b shelve: move 'nothing changed' messaging to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30391
diff changeset
   403
def _nothingtoshelvemessaging(ui, repo, pats, opts):
dedf0915ca5b shelve: move 'nothing changed' messaging to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30391
diff changeset
   404
    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: 30391
diff changeset
   405
    if stat.deleted:
dedf0915ca5b shelve: move 'nothing changed' messaging to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30391
diff changeset
   406
        ui.status(_("nothing changed (%d missing files, see "
dedf0915ca5b shelve: move 'nothing changed' messaging to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30391
diff changeset
   407
                    "'hg status')\n") % len(stat.deleted))
dedf0915ca5b shelve: move 'nothing changed' messaging to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30391
diff changeset
   408
    else:
dedf0915ca5b shelve: move 'nothing changed' messaging to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30391
diff changeset
   409
        ui.status(_("nothing changed\n"))
dedf0915ca5b shelve: move 'nothing changed' messaging to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30391
diff changeset
   410
30393
455f7856db20 shelve: move actual created commit shelving to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30392
diff changeset
   411
def _shelvecreatedcommit(repo, node, name):
39399
da121c9dc0f2 shelve: store shelved node in a new data file
Boris Feld <boris.feld@octobus.net>
parents: 39371
diff changeset
   412
    info = {'node': nodemod.hex(node)}
da121c9dc0f2 shelve: store shelved node in a new data file
Boris Feld <boris.feld@octobus.net>
parents: 39371
diff changeset
   413
    shelvedfile(repo, name, 'shelve').writeinfo(info)
30393
455f7856db20 shelve: move actual created commit shelving to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30392
diff changeset
   414
    bases = list(mutableancestors(repo[node]))
455f7856db20 shelve: move actual created commit shelving to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30392
diff changeset
   415
    shelvedfile(repo, name, 'hg').writebundle(bases, node)
37603
678d760c71ff export: extract function to write patch to file object (API)
Yuya Nishihara <yuya@tcha.org>
parents: 37087
diff changeset
   416
    with shelvedfile(repo, name, patchextension).opener('wb') as fp:
678d760c71ff export: extract function to write patch to file object (API)
Yuya Nishihara <yuya@tcha.org>
parents: 37087
diff changeset
   417
        cmdutil.exportfile(repo, [node], fp, opts=mdiff.diffopts(git=True))
30393
455f7856db20 shelve: move actual created commit shelving to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30392
diff changeset
   418
30394
21a75b63c10e shelve: move unknown files handling to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30393
diff changeset
   419
def _includeunknownfiles(repo, pats, opts, extra):
21a75b63c10e shelve: move unknown files handling to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30393
diff changeset
   420
    s = repo.status(match=scmutil.match(repo[None], pats, opts),
21a75b63c10e shelve: move unknown files handling to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30393
diff changeset
   421
                    unknown=True)
21a75b63c10e shelve: move unknown files handling to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30393
diff changeset
   422
    if s.unknown:
21a75b63c10e shelve: move unknown files handling to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30393
diff changeset
   423
        extra['shelve_unknown'] = '\0'.join(s.unknown)
21a75b63c10e shelve: move unknown files handling to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30393
diff changeset
   424
        repo[None].add(s.unknown)
21a75b63c10e shelve: move unknown files handling to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30393
diff changeset
   425
30395
b573d7ca31c4 shelve: move shelve-finishing logic to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30394
diff changeset
   426
def _finishshelve(repo):
b573d7ca31c4 shelve: move shelve-finishing logic to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30394
diff changeset
   427
    _aborttransaction(repo)
b573d7ca31c4 shelve: move shelve-finishing logic to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30394
diff changeset
   428
39369
d52fa7ddd1ac shelve: move createcmd next to _docreatecmd
Boris Feld <boris.feld@octobus.net>
parents: 38908
diff changeset
   429
def createcmd(ui, repo, pats, opts):
d52fa7ddd1ac shelve: move createcmd next to _docreatecmd
Boris Feld <boris.feld@octobus.net>
parents: 38908
diff changeset
   430
    """subcommand that creates a new shelve"""
d52fa7ddd1ac shelve: move createcmd next to _docreatecmd
Boris Feld <boris.feld@octobus.net>
parents: 38908
diff changeset
   431
    with repo.wlock():
d52fa7ddd1ac shelve: move createcmd next to _docreatecmd
Boris Feld <boris.feld@octobus.net>
parents: 38908
diff changeset
   432
        cmdutil.checkunfinished(repo)
d52fa7ddd1ac shelve: move createcmd next to _docreatecmd
Boris Feld <boris.feld@octobus.net>
parents: 38908
diff changeset
   433
        return _docreatecmd(ui, repo, pats, opts)
d52fa7ddd1ac shelve: move createcmd next to _docreatecmd
Boris Feld <boris.feld@octobus.net>
parents: 38908
diff changeset
   434
30390
84e8cbdbdee4 shelve: move mutableancestors to not be a closure
Kostia Balytskyi <ikostia@fb.com>
parents: 30389
diff changeset
   435
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
   436
    wctx = repo[None]
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   437
    parents = wctx.parents()
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   438
    if len(parents) > 1:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26577
diff changeset
   439
        raise error.Abort(_('cannot shelve while merging'))
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   440
    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
   441
    origbranch = wctx.branch()
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   442
28378
96a7368a79b6 shelve: use absolute_import
timeless <timeless@mozdev.org>
parents: 28124
diff changeset
   443
    if parent.node() != nodemod.nullid:
27092
156985f2dec0 shelve: use colon instead of quotes in 'changes to' description
Siddharth Agarwal <sid0@fb.com>
parents: 27021
diff changeset
   444
        desc = "changes to: %s" % parent.description().split('\n', 1)[0]
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   445
    else:
20411
66359d8b8d7e shelve: add 'changes to' prefix to default shelve message
Mads Kiilerich <madski@unity3d.com>
parents: 20410
diff changeset
   446
        desc = '(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
   447
28401
2565fe39a76c shelve: changes getting opts values by get method
liscju <piotr.listkiewicz@gmail.com>
parents: 28378
diff changeset
   448
    if not opts.get('message'):
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   449
        opts['message'] = desc
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   450
31669
1cbeefa59343 shelve: add logic to preserve active bookmarks
Kostia Balytskyi <ikostia@fb.com>
parents: 31561
diff changeset
   451
    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
   452
    try:
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   453
        lock = repo.lock()
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   454
19951
d51c4d85ec23 spelling: random spell checker fixes
Mads Kiilerich <madski@unity3d.com>
parents: 19943
diff changeset
   455
        # 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
   456
        # pull races. ensure we don't print the abort message to stderr.
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   457
        tr = repo.transaction('commit', report=lambda x: None)
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   458
24477
325f03de849d shelve: add interactive mode command line option
Laurent Charignon <lcharignon@fb.com>
parents: 23895
diff changeset
   459
        interactive = opts.get('interactive', False)
27908
d73a5ab18015 shelve: permit shelves to contain unknown files
Simon Farnsworth <simonfar@fb.com>
parents: 27888
diff changeset
   460
        includeunknown = (opts.get('unknown', False) and
d73a5ab18015 shelve: permit shelves to contain unknown files
Simon Farnsworth <simonfar@fb.com>
parents: 27888
diff changeset
   461
                          not opts.get('addremove', False))
d73a5ab18015 shelve: permit shelves to contain unknown files
Simon Farnsworth <simonfar@fb.com>
parents: 27888
diff changeset
   462
30389
684068d24658 shelve: move shelve name generation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30388
diff changeset
   463
        name = getshelvename(repo, parent, opts)
31669
1cbeefa59343 shelve: add logic to preserve active bookmarks
Kostia Balytskyi <ikostia@fb.com>
parents: 31561
diff changeset
   464
        activebookmark = _backupactivebookmark(repo)
30394
21a75b63c10e shelve: move unknown files handling to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30393
diff changeset
   465
        extra = {}
27908
d73a5ab18015 shelve: permit shelves to contain unknown files
Simon Farnsworth <simonfar@fb.com>
parents: 27888
diff changeset
   466
        if includeunknown:
30394
21a75b63c10e shelve: move unknown files handling to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30393
diff changeset
   467
            _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
   468
28572
43c204ddf333 shelve: make non bare shelve not saving branch information in bundle
liscju <piotr.listkiewicz@gmail.com>
parents: 28571
diff changeset
   469
        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
   470
            # 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
   471
            # at bundled commit
43c204ddf333 shelve: make non bare shelve not saving branch information in bundle
liscju <piotr.listkiewicz@gmail.com>
parents: 28571
diff changeset
   472
            repo.dirstate.setbranch(repo['.'].branch())
43c204ddf333 shelve: make non bare shelve not saving branch information in bundle
liscju <piotr.listkiewicz@gmail.com>
parents: 28571
diff changeset
   473
30391
caba61934721 shelve: move commitfunc creation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30390
diff changeset
   474
        commitfunc = getcommitfunc(extra, interactive, editor=True)
24478
95cbc77c0cad shelve: add interactive mode
Laurent Charignon <lcharignon@fb.com>
parents: 24477
diff changeset
   475
        if not interactive:
95cbc77c0cad shelve: add interactive mode
Laurent Charignon <lcharignon@fb.com>
parents: 24477
diff changeset
   476
            node = cmdutil.commit(ui, repo, commitfunc, pats, opts)
95cbc77c0cad shelve: add interactive mode
Laurent Charignon <lcharignon@fb.com>
parents: 24477
diff changeset
   477
        else:
30391
caba61934721 shelve: move commitfunc creation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30390
diff changeset
   478
            node = cmdutil.dorecord(ui, repo, commitfunc, None,
31669
1cbeefa59343 shelve: add logic to preserve active bookmarks
Kostia Balytskyi <ikostia@fb.com>
parents: 31561
diff changeset
   479
                                    False, cmdutil.recordfilter, *pats,
35046
aad6b9fdfc75 py3: handle keyword arguments in hgext/shelve.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34496
diff changeset
   480
                                    **pycompat.strkwargs(opts))
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   481
        if not node:
30392
dedf0915ca5b shelve: move 'nothing changed' messaging to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30391
diff changeset
   482
            _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
   483
            return 1
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   484
30393
455f7856db20 shelve: move actual created commit shelving to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30392
diff changeset
   485
        _shelvecreatedcommit(repo, node, name)
19874
5836edcbdc2e shelve: copy bookmarks and restore them after a commit
David Soria Parra <dsp@experimentalworks.net>
parents: 19856
diff changeset
   486
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   487
        if ui.formatted():
37087
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36789
diff changeset
   488
            desc = stringutil.ellipsis(desc, ui.termwidth())
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   489
        ui.status(_('shelved as %s\n') % name)
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   490
        hg.update(repo, parent.node())
28571
3f0e25e89e28 shelve: preserve newly created branch on non-bare shelve in wctx (BC)
liscju <piotr.listkiewicz@gmail.com>
parents: 28401
diff changeset
   491
        if origbranch != repo['.'].branch() and not _isbareshelve(pats, opts):
3f0e25e89e28 shelve: preserve newly created branch on non-bare shelve in wctx (BC)
liscju <piotr.listkiewicz@gmail.com>
parents: 28401
diff changeset
   492
            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
   493
30395
b573d7ca31c4 shelve: move shelve-finishing logic to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30394
diff changeset
   494
        _finishshelve(repo)
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   495
    finally:
31669
1cbeefa59343 shelve: add logic to preserve active bookmarks
Kostia Balytskyi <ikostia@fb.com>
parents: 31561
diff changeset
   496
        _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
   497
        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
   498
28571
3f0e25e89e28 shelve: preserve newly created branch on non-bare shelve in wctx (BC)
liscju <piotr.listkiewicz@gmail.com>
parents: 28401
diff changeset
   499
def _isbareshelve(pats, opts):
3f0e25e89e28 shelve: preserve newly created branch on non-bare shelve in wctx (BC)
liscju <piotr.listkiewicz@gmail.com>
parents: 28401
diff changeset
   500
    return (not pats
3f0e25e89e28 shelve: preserve newly created branch on non-bare shelve in wctx (BC)
liscju <piotr.listkiewicz@gmail.com>
parents: 28401
diff changeset
   501
            and not opts.get('interactive', False)
3f0e25e89e28 shelve: preserve newly created branch on non-bare shelve in wctx (BC)
liscju <piotr.listkiewicz@gmail.com>
parents: 28401
diff changeset
   502
            and not opts.get('include', False)
3f0e25e89e28 shelve: preserve newly created branch on non-bare shelve in wctx (BC)
liscju <piotr.listkiewicz@gmail.com>
parents: 28401
diff changeset
   503
            and not opts.get('exclude', False))
3f0e25e89e28 shelve: preserve newly created branch on non-bare shelve in wctx (BC)
liscju <piotr.listkiewicz@gmail.com>
parents: 28401
diff changeset
   504
28572
43c204ddf333 shelve: make non bare shelve not saving branch information in bundle
liscju <piotr.listkiewicz@gmail.com>
parents: 28571
diff changeset
   505
def _iswctxonnewbranch(repo):
43c204ddf333 shelve: make non bare shelve not saving branch information in bundle
liscju <piotr.listkiewicz@gmail.com>
parents: 28571
diff changeset
   506
    return repo[None].branch() != repo['.'].branch()
43c204ddf333 shelve: make non bare shelve not saving branch information in bundle
liscju <piotr.listkiewicz@gmail.com>
parents: 28571
diff changeset
   507
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   508
def cleanupcmd(ui, repo):
19911
1c58e368fbfd shelve: some docstring cleanups
Augie Fackler <raf@durin42.com>
parents: 19909
diff changeset
   509
    """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
   510
27835
c448d7e00bf9 with: use context manager for wlock in shelve cleanupcmd
Bryan O'Sullivan <bryano@fb.com>
parents: 27834
diff changeset
   511
    with repo.wlock():
28862
39130afcce60 shelve: refactor directory name into constant
Oleg Afanasyev <olegaf@fb.com>
parents: 28666
diff changeset
   512
        for (name, _type) in repo.vfs.readdir(shelvedir):
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   513
            suffix = name.rsplit('.', 1)[-1]
30388
c5126aab9c37 shelve: move possible shelve file extensions to a single place
Kostia Balytskyi <ikostia@fb.com>
parents: 29852
diff changeset
   514
            if suffix in shelvefileextensions:
25712
8a6264a2ee60 shelve: always backup shelves instead of deleting them
Colin Chan <colinchan@fb.com>
parents: 25660
diff changeset
   515
                shelvedfile(repo, name).movetobackup()
25713
2ca116614cfc shelve: only keep the latest N shelve backups
Colin Chan <colinchan@fb.com>
parents: 25712
diff changeset
   516
            cleanupoldbackups(repo)
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   517
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   518
def deletecmd(ui, repo, pats):
19911
1c58e368fbfd shelve: some docstring cleanups
Augie Fackler <raf@durin42.com>
parents: 19909
diff changeset
   519
    """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
   520
    if not pats:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26577
diff changeset
   521
        raise error.Abort(_('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
   522
    with repo.wlock():
1c2408c28aff with: use context manager for wlock in shelve deletecmd
Bryan O'Sullivan <bryano@fb.com>
parents: 27835
diff changeset
   523
        try:
1c2408c28aff with: use context manager for wlock in shelve deletecmd
Bryan O'Sullivan <bryano@fb.com>
parents: 27835
diff changeset
   524
            for name in pats:
30388
c5126aab9c37 shelve: move possible shelve file extensions to a single place
Kostia Balytskyi <ikostia@fb.com>
parents: 29852
diff changeset
   525
                for suffix in shelvefileextensions:
c5126aab9c37 shelve: move possible shelve file extensions to a single place
Kostia Balytskyi <ikostia@fb.com>
parents: 29852
diff changeset
   526
                    shfile = shelvedfile(repo, name, suffix)
c5126aab9c37 shelve: move possible shelve file extensions to a single place
Kostia Balytskyi <ikostia@fb.com>
parents: 29852
diff changeset
   527
                    # patch file is necessary, as it should
c5126aab9c37 shelve: move possible shelve file extensions to a single place
Kostia Balytskyi <ikostia@fb.com>
parents: 29852
diff changeset
   528
                    # be present for any kind of shelve,
c5126aab9c37 shelve: move possible shelve file extensions to a single place
Kostia Balytskyi <ikostia@fb.com>
parents: 29852
diff changeset
   529
                    # but the .hg file is optional as in future we
c5126aab9c37 shelve: move possible shelve file extensions to a single place
Kostia Balytskyi <ikostia@fb.com>
parents: 29852
diff changeset
   530
                    # will add obsolete shelve with does not create a
c5126aab9c37 shelve: move possible shelve file extensions to a single place
Kostia Balytskyi <ikostia@fb.com>
parents: 29852
diff changeset
   531
                    # bundle
30560
1775975dd439 shelve: move patch extension to a string constant
Kostia Balytskyi <ikostia@fb.com>
parents: 30551
diff changeset
   532
                    if shfile.exists() or suffix == patchextension:
30388
c5126aab9c37 shelve: move possible shelve file extensions to a single place
Kostia Balytskyi <ikostia@fb.com>
parents: 29852
diff changeset
   533
                        shfile.movetobackup()
27836
1c2408c28aff with: use context manager for wlock in shelve deletecmd
Bryan O'Sullivan <bryano@fb.com>
parents: 27835
diff changeset
   534
            cleanupoldbackups(repo)
1c2408c28aff with: use context manager for wlock in shelve deletecmd
Bryan O'Sullivan <bryano@fb.com>
parents: 27835
diff changeset
   535
        except OSError as err:
1c2408c28aff with: use context manager for wlock in shelve deletecmd
Bryan O'Sullivan <bryano@fb.com>
parents: 27835
diff changeset
   536
            if err.errno != errno.ENOENT:
1c2408c28aff with: use context manager for wlock in shelve deletecmd
Bryan O'Sullivan <bryano@fb.com>
parents: 27835
diff changeset
   537
                raise
1c2408c28aff with: use context manager for wlock in shelve deletecmd
Bryan O'Sullivan <bryano@fb.com>
parents: 27835
diff changeset
   538
            raise error.Abort(_("shelved change '%s' not found") % name)
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   539
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   540
def listshelves(repo):
19911
1c58e368fbfd shelve: some docstring cleanups
Augie Fackler <raf@durin42.com>
parents: 19909
diff changeset
   541
    """return all shelves in repo as list of (time, filename)"""
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   542
    try:
28862
39130afcce60 shelve: refactor directory name into constant
Oleg Afanasyev <olegaf@fb.com>
parents: 28666
diff changeset
   543
        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
   544
    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
   545
        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
   546
            raise
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   547
        return []
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   548
    info = []
22199
b3e51675f98e cleanup: avoid _ for local unused tmp variables - that is reserved for i18n
Mads Kiilerich <madski@unity3d.com>
parents: 22184
diff changeset
   549
    for (name, _type) in names:
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   550
        pfx, sfx = name.rsplit('.', 1)
30560
1775975dd439 shelve: move patch extension to a string constant
Kostia Balytskyi <ikostia@fb.com>
parents: 30551
diff changeset
   551
        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
   552
            continue
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   553
        st = shelvedfile(repo, name).stat()
36789
ffa3026d4196 cleanup: use stat_result[stat.ST_MTIME] instead of stat_result.st_mtime
Augie Fackler <augie@google.com>
parents: 36636
diff changeset
   554
        info.append((st[stat.ST_MTIME], shelvedfile(repo, pfx).filename()))
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   555
    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
   556
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   557
def listcmd(ui, repo, pats, opts):
19911
1c58e368fbfd shelve: some docstring cleanups
Augie Fackler <raf@durin42.com>
parents: 19909
diff changeset
   558
    """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
   559
    pats = set(pats)
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   560
    width = 80
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   561
    if not ui.plain():
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   562
        width = ui.termwidth()
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   563
    namelabel = 'shelve.newest'
31113
356937ea7a02 pager: add support to --patch, --list and --stat options of hg shelve
Pulkit Goyal <7895pulkit@gmail.com>
parents: 31041
diff changeset
   564
    ui.pager('shelve')
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   565
    for mtime, name in listshelves(repo):
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   566
        sname = util.split(name)[1]
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   567
        if pats and sname not in pats:
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   568
            continue
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   569
        ui.write(sname, label=namelabel)
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   570
        namelabel = 'shelve.name'
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   571
        if ui.quiet:
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   572
            ui.write('\n')
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   573
            continue
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   574
        ui.write(' ' * (16 - len(sname)))
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   575
        used = 16
36636
c6061cadb400 util: extract all date-related utils in utils/dateutil module
Boris Feld <boris.feld@octobus.net>
parents: 36526
diff changeset
   576
        date = dateutil.makedate(mtime)
c6061cadb400 util: extract all date-related utils in utils/dateutil module
Boris Feld <boris.feld@octobus.net>
parents: 36526
diff changeset
   577
        age = '(%s)' % templatefilters.age(date, abbrev=True)
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   578
        ui.write(age, label='shelve.age')
19855
a3b285882724 shelve: new output format for shelve listings
David Soria Parra <dsp@experimentalworks.net>
parents: 19854
diff changeset
   579
        ui.write(' ' * (12 - len(age)))
a3b285882724 shelve: new output format for shelve listings
David Soria Parra <dsp@experimentalworks.net>
parents: 19854
diff changeset
   580
        used += 12
30560
1775975dd439 shelve: move patch extension to a string constant
Kostia Balytskyi <ikostia@fb.com>
parents: 30551
diff changeset
   581
        with open(name + '.' + patchextension, 'rb') as fp:
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   582
            while True:
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   583
                line = fp.readline()
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   584
                if not line:
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   585
                    break
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   586
                if not line.startswith('#'):
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   587
                    desc = line.rstrip()
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   588
                    if ui.formatted():
37087
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36789
diff changeset
   589
                        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
   590
                    ui.write(desc)
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   591
                    break
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   592
            ui.write('\n')
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   593
            if not (opts['patch'] or opts['stat']):
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   594
                continue
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   595
            difflines = fp.readlines()
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   596
            if opts['patch']:
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   597
                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
   598
                    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
   599
            if opts['stat']:
30417
e1677cc29da6 patch: remove unused git parameter from patch.diffstat()
Henning Schild <henning@hennsch.de>
parents: 30395
diff changeset
   600
                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
   601
                    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
   602
38715
905b66681004 shelve: pick the most recent shelve if none specified for --patch/--stat
Danny Hooper <hooper@google.com>
parents: 38714
diff changeset
   603
def patchcmds(ui, repo, pats, opts):
30823
806a830e6612 shelve: allow multiple shelves with --patch and --stat
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30674
diff changeset
   604
    """subcommand that displays shelves"""
806a830e6612 shelve: allow multiple shelves with --patch and --stat
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30674
diff changeset
   605
    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
   606
        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
   607
        if not shelves:
905b66681004 shelve: pick the most recent shelve if none specified for --patch/--stat
Danny Hooper <hooper@google.com>
parents: 38714
diff changeset
   608
            raise error.Abort(_("there are no shelves to show"))
905b66681004 shelve: pick the most recent shelve if none specified for --patch/--stat
Danny Hooper <hooper@google.com>
parents: 38714
diff changeset
   609
        mtime, name = shelves[0]
905b66681004 shelve: pick the most recent shelve if none specified for --patch/--stat
Danny Hooper <hooper@google.com>
parents: 38714
diff changeset
   610
        sname = util.split(name)[1]
905b66681004 shelve: pick the most recent shelve if none specified for --patch/--stat
Danny Hooper <hooper@google.com>
parents: 38714
diff changeset
   611
        pats = [sname]
25104
d6453f6fbdba shelve: allow --patch and --stat without --list for a single shelf
Tony Tung <tonytung@fb.com>
parents: 25103
diff changeset
   612
30823
806a830e6612 shelve: allow multiple shelves with --patch and --stat
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30674
diff changeset
   613
    for shelfname in pats:
806a830e6612 shelve: allow multiple shelves with --patch and --stat
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30674
diff changeset
   614
        if not shelvedfile(repo, shelfname, patchextension).exists():
806a830e6612 shelve: allow multiple shelves with --patch and --stat
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30674
diff changeset
   615
            raise error.Abort(_("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
   616
d6453f6fbdba shelve: allow --patch and --stat without --list for a single shelf
Tony Tung <tonytung@fb.com>
parents: 25103
diff changeset
   617
    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
   618
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   619
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
   620
    """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
   621
    if state.parents != repo.dirstate.parents():
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26577
diff changeset
   622
        raise error.Abort(_('working directory parents do not match unshelve '
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   623
                           'state'))
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   624
19943
4de116871044 shelve: make unshelve work even if it don't run in repository root
Takumi IINO <trot.thunder@gmail.com>
parents: 19911
diff changeset
   625
def pathtofiles(repo, files):
4de116871044 shelve: make unshelve work even if it don't run in repository root
Takumi IINO <trot.thunder@gmail.com>
parents: 19911
diff changeset
   626
    cwd = repo.getcwd()
4de116871044 shelve: make unshelve work even if it don't run in repository root
Takumi IINO <trot.thunder@gmail.com>
parents: 19911
diff changeset
   627
    return [repo.pathto(f, cwd) for f in files]
4de116871044 shelve: make unshelve work even if it don't run in repository root
Takumi IINO <trot.thunder@gmail.com>
parents: 19911
diff changeset
   628
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   629
def unshelveabort(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
   630
    """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
   631
    with repo.lock():
19961
1d7a36ff2615 shelve: use rebase instead of merge (issue4068)
Durham Goode <durham@fb.com>
parents: 19951
diff changeset
   632
        try:
27841
83995fdde225 with: use context manager in unshelveabort
Bryan O'Sullivan <bryano@fb.com>
parents: 27838
diff changeset
   633
            checkparents(repo, state)
19961
1d7a36ff2615 shelve: use rebase instead of merge (issue4068)
Durham Goode <durham@fb.com>
parents: 19951
diff changeset
   634
38466
61e4cf1be5b2 shelve: directly handle the abort process
Boris Feld <boris.feld@octobus.net>
parents: 38011
diff changeset
   635
            merge.update(repo, state.pendingctx, False, True)
61e4cf1be5b2 shelve: directly handle the abort process
Boris Feld <boris.feld@octobus.net>
parents: 38011
diff changeset
   636
            if (state.activebookmark
61e4cf1be5b2 shelve: directly handle the abort process
Boris Feld <boris.feld@octobus.net>
parents: 38011
diff changeset
   637
                    and state.activebookmark in repo._bookmarks):
61e4cf1be5b2 shelve: directly handle the abort process
Boris Feld <boris.feld@octobus.net>
parents: 38011
diff changeset
   638
                bookmarks.activate(repo, state.activebookmark)
61e4cf1be5b2 shelve: directly handle the abort process
Boris Feld <boris.feld@octobus.net>
parents: 38011
diff changeset
   639
61e4cf1be5b2 shelve: directly handle the abort process
Boris Feld <boris.feld@octobus.net>
parents: 38011
diff changeset
   640
            if repo.vfs.exists('unshelverebasestate'):
61e4cf1be5b2 shelve: directly handle the abort process
Boris Feld <boris.feld@octobus.net>
parents: 38011
diff changeset
   641
                repo.vfs.rename('unshelverebasestate', 'rebasestate')
61e4cf1be5b2 shelve: directly handle the abort process
Boris Feld <boris.feld@octobus.net>
parents: 38011
diff changeset
   642
                rebase.clearstatus(repo)
19961
1d7a36ff2615 shelve: use rebase instead of merge (issue4068)
Durham Goode <durham@fb.com>
parents: 19951
diff changeset
   643
27841
83995fdde225 with: use context manager in unshelveabort
Bryan O'Sullivan <bryano@fb.com>
parents: 27838
diff changeset
   644
            mergefiles(ui, repo, state.wctx, state.pendingctx)
31888
1c398f7f4aa4 shelve: rename nodestoprune to nodestoremove
Kostia Balytskyi <ikostia@fb.com>
parents: 31762
diff changeset
   645
            repair.strip(ui, repo, state.nodestoremove, backup=False,
27841
83995fdde225 with: use context manager in unshelveabort
Bryan O'Sullivan <bryano@fb.com>
parents: 27838
diff changeset
   646
                         topic='shelve')
83995fdde225 with: use context manager in unshelveabort
Bryan O'Sullivan <bryano@fb.com>
parents: 27838
diff changeset
   647
        finally:
83995fdde225 with: use context manager in unshelveabort
Bryan O'Sullivan <bryano@fb.com>
parents: 27838
diff changeset
   648
            shelvedstate.clear(repo)
83995fdde225 with: use context manager in unshelveabort
Bryan O'Sullivan <bryano@fb.com>
parents: 27838
diff changeset
   649
            ui.warn(_("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
   650
20149
578b888c820e unshelve: don't commit unknown files during unshelve (issue4113)
Durham Goode <durham@fb.com>
parents: 20103
diff changeset
   651
def mergefiles(ui, repo, wctx, shelvectx):
19961
1d7a36ff2615 shelve: use rebase instead of merge (issue4068)
Durham Goode <durham@fb.com>
parents: 19951
diff changeset
   652
    """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
   653
    dirstate."""
31762
473f2fcc7629 shelve: move ui.quiet manipulations to configoverride
Kostia Balytskyi <ikostia@fb.com>
parents: 31669
diff changeset
   654
    with ui.configoverride({('ui', 'quiet'): True}):
19961
1d7a36ff2615 shelve: use rebase instead of merge (issue4068)
Durham Goode <durham@fb.com>
parents: 19951
diff changeset
   655
        hg.update(repo, wctx.node())
1d7a36ff2615 shelve: use rebase instead of merge (issue4068)
Durham Goode <durham@fb.com>
parents: 19951
diff changeset
   656
        files = []
1d7a36ff2615 shelve: use rebase instead of merge (issue4068)
Durham Goode <durham@fb.com>
parents: 19951
diff changeset
   657
        files.extend(shelvectx.files())
1d7a36ff2615 shelve: use rebase instead of merge (issue4068)
Durham Goode <durham@fb.com>
parents: 19951
diff changeset
   658
        files.extend(shelvectx.parents()[0].files())
20149
578b888c820e unshelve: don't commit unknown files during unshelve (issue4113)
Durham Goode <durham@fb.com>
parents: 20103
diff changeset
   659
578b888c820e unshelve: don't commit unknown files during unshelve (issue4113)
Durham Goode <durham@fb.com>
parents: 20103
diff changeset
   660
        # revert will overwrite unknown files, so move them out of the way
22922
ebef5fcf7bd0 shelve: access status fields by name rather than index
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22898
diff changeset
   661
        for file in repo.status(unknown=True).unknown:
20149
578b888c820e unshelve: don't commit unknown files during unshelve (issue4113)
Durham Goode <durham@fb.com>
parents: 20103
diff changeset
   662
            if file in files:
27651
07fc2f2134ba origpath: move from cmdutil to scmutil
Siddharth Agarwal <sid0@fb.com>
parents: 27288
diff changeset
   663
                util.rename(file, scmutil.origpath(ui, repo, file))
22184
fb8065de47b0 unshelve: silence internal revert
Matt Mackall <mpm@selenic.com>
parents: 22057
diff changeset
   664
        ui.pushbuffer(True)
19961
1d7a36ff2615 shelve: use rebase instead of merge (issue4068)
Durham Goode <durham@fb.com>
parents: 19951
diff changeset
   665
        cmdutil.revert(ui, repo, shelvectx, repo.dirstate.parents(),
1d7a36ff2615 shelve: use rebase instead of merge (issue4068)
Durham Goode <durham@fb.com>
parents: 19951
diff changeset
   666
                       *pathtofiles(repo, files),
35952
78b985c75731 py3: add r'' to convert keys to keyword arguments to str
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35046
diff changeset
   667
                       **{r'no_backup': True})
22184
fb8065de47b0 unshelve: silence internal revert
Matt Mackall <mpm@selenic.com>
parents: 22057
diff changeset
   668
        ui.popbuffer()
19961
1d7a36ff2615 shelve: use rebase instead of merge (issue4068)
Durham Goode <durham@fb.com>
parents: 19951
diff changeset
   669
28573
6a42564081cb shelve: adds restoring newly created branch (issue5048) (BC)
liscju <piotr.listkiewicz@gmail.com>
parents: 28572
diff changeset
   670
def restorebranch(ui, repo, branchtorestore):
6a42564081cb shelve: adds restoring newly created branch (issue5048) (BC)
liscju <piotr.listkiewicz@gmail.com>
parents: 28572
diff changeset
   671
    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
   672
        repo.dirstate.setbranch(branchtorestore)
6a42564081cb shelve: adds restoring newly created branch (issue5048) (BC)
liscju <piotr.listkiewicz@gmail.com>
parents: 28572
diff changeset
   673
        ui.status(_('marked working directory as branch %s\n')
6a42564081cb shelve: adds restoring newly created branch (issue5048) (BC)
liscju <piotr.listkiewicz@gmail.com>
parents: 28572
diff changeset
   674
                  % branchtorestore)
6a42564081cb shelve: adds restoring newly created branch (issue5048) (BC)
liscju <piotr.listkiewicz@gmail.com>
parents: 28572
diff changeset
   675
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   676
def unshelvecleanup(ui, repo, name, opts):
19911
1c58e368fbfd shelve: some docstring cleanups
Augie Fackler <raf@durin42.com>
parents: 19909
diff changeset
   677
    """remove related files after an unshelve"""
28401
2565fe39a76c shelve: changes getting opts values by get method
liscju <piotr.listkiewicz@gmail.com>
parents: 28378
diff changeset
   678
    if not opts.get('keep'):
30388
c5126aab9c37 shelve: move possible shelve file extensions to a single place
Kostia Balytskyi <ikostia@fb.com>
parents: 29852
diff changeset
   679
        for filetype in shelvefileextensions:
c5126aab9c37 shelve: move possible shelve file extensions to a single place
Kostia Balytskyi <ikostia@fb.com>
parents: 29852
diff changeset
   680
            shfile = shelvedfile(repo, name, filetype)
c5126aab9c37 shelve: move possible shelve file extensions to a single place
Kostia Balytskyi <ikostia@fb.com>
parents: 29852
diff changeset
   681
            if shfile.exists():
c5126aab9c37 shelve: move possible shelve file extensions to a single place
Kostia Balytskyi <ikostia@fb.com>
parents: 29852
diff changeset
   682
                shfile.movetobackup()
25713
2ca116614cfc shelve: only keep the latest N shelve backups
Colin Chan <colinchan@fb.com>
parents: 25712
diff changeset
   683
        cleanupoldbackups(repo)
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   684
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   685
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
   686
    """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
   687
    # 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
   688
    # parent, second is the temporary "fake" commit we're unshelving.
27838
60b850b7e4ef with: use context manager for lock in continue
Bryan O'Sullivan <bryano@fb.com>
parents: 27837
diff changeset
   689
    with repo.lock():
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   690
        checkparents(repo, state)
26992
b3b5ed560283 shelve: switch to mergestate.read()
Siddharth Agarwal <sid0@fb.com>
parents: 26942
diff changeset
   691
        ms = merge.mergestate.read(repo)
33313
ea03b3223611 shelve: don't reimplement mergestate.unresolved()
Martin von Zweigbergk <martinvonz@google.com>
parents: 33055
diff changeset
   692
        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
   693
            raise error.Abort(
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   694
                _("unresolved conflicts, can't continue"),
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   695
                hint=_("see 'hg resolve', then 'hg unshelve --continue'"))
19961
1d7a36ff2615 shelve: use rebase instead of merge (issue4068)
Durham Goode <durham@fb.com>
parents: 19951
diff changeset
   696
38467
f4776f8b98e0 shelve: directly handle `--continue`
Boris Feld <boris.feld@octobus.net>
parents: 38466
diff changeset
   697
        shelvectx = repo[state.parents[1]]
f4776f8b98e0 shelve: directly handle `--continue`
Boris Feld <boris.feld@octobus.net>
parents: 38466
diff changeset
   698
        pendingctx = state.pendingctx
f4776f8b98e0 shelve: directly handle `--continue`
Boris Feld <boris.feld@octobus.net>
parents: 38466
diff changeset
   699
38618
c829749e7639 shelve: directly handle the initial parent alignment
Boris Feld <boris.feld@octobus.net>
parents: 38512
diff changeset
   700
        with repo.dirstate.parentchange():
c829749e7639 shelve: directly handle the initial parent alignment
Boris Feld <boris.feld@octobus.net>
parents: 38512
diff changeset
   701
            repo.setparents(state.pendingctx.node(), nodemod.nullid)
c829749e7639 shelve: directly handle the initial parent alignment
Boris Feld <boris.feld@octobus.net>
parents: 38512
diff changeset
   702
            repo.dirstate.write(repo.currenttransaction())
c829749e7639 shelve: directly handle the initial parent alignment
Boris Feld <boris.feld@octobus.net>
parents: 38512
diff changeset
   703
38467
f4776f8b98e0 shelve: directly handle `--continue`
Boris Feld <boris.feld@octobus.net>
parents: 38466
diff changeset
   704
        overrides = {('phases', 'new-commit'): phases.secret}
f4776f8b98e0 shelve: directly handle `--continue`
Boris Feld <boris.feld@octobus.net>
parents: 38466
diff changeset
   705
        with repo.ui.configoverride(overrides, 'unshelve'):
f4776f8b98e0 shelve: directly handle `--continue`
Boris Feld <boris.feld@octobus.net>
parents: 38466
diff changeset
   706
            with repo.dirstate.parentchange():
f4776f8b98e0 shelve: directly handle `--continue`
Boris Feld <boris.feld@octobus.net>
parents: 38466
diff changeset
   707
                repo.setparents(state.parents[0], nodemod.nullid)
f4776f8b98e0 shelve: directly handle `--continue`
Boris Feld <boris.feld@octobus.net>
parents: 38466
diff changeset
   708
                newnode = repo.commit(text=shelvectx.description(),
f4776f8b98e0 shelve: directly handle `--continue`
Boris Feld <boris.feld@octobus.net>
parents: 38466
diff changeset
   709
                                      extra=shelvectx.extra(),
f4776f8b98e0 shelve: directly handle `--continue`
Boris Feld <boris.feld@octobus.net>
parents: 38466
diff changeset
   710
                                      user=shelvectx.user(),
f4776f8b98e0 shelve: directly handle `--continue`
Boris Feld <boris.feld@octobus.net>
parents: 38466
diff changeset
   711
                                      date=shelvectx.date())
19961
1d7a36ff2615 shelve: use rebase instead of merge (issue4068)
Durham Goode <durham@fb.com>
parents: 19951
diff changeset
   712
38467
f4776f8b98e0 shelve: directly handle `--continue`
Boris Feld <boris.feld@octobus.net>
parents: 38466
diff changeset
   713
        if newnode is None:
f4776f8b98e0 shelve: directly handle `--continue`
Boris Feld <boris.feld@octobus.net>
parents: 38466
diff changeset
   714
            # If it ended up being a no-op commit, then the normal
f4776f8b98e0 shelve: directly handle `--continue`
Boris Feld <boris.feld@octobus.net>
parents: 38466
diff changeset
   715
            # merge state clean-up path doesn't happen, so do it
f4776f8b98e0 shelve: directly handle `--continue`
Boris Feld <boris.feld@octobus.net>
parents: 38466
diff changeset
   716
            # here. Fix issue5494
f4776f8b98e0 shelve: directly handle `--continue`
Boris Feld <boris.feld@octobus.net>
parents: 38466
diff changeset
   717
            merge.mergestate.clean(repo)
19961
1d7a36ff2615 shelve: use rebase instead of merge (issue4068)
Durham Goode <durham@fb.com>
parents: 19951
diff changeset
   718
            shelvectx = state.pendingctx
38467
f4776f8b98e0 shelve: directly handle `--continue`
Boris Feld <boris.feld@octobus.net>
parents: 38466
diff changeset
   719
            msg = _('note: unshelved changes already existed '
f4776f8b98e0 shelve: directly handle `--continue`
Boris Feld <boris.feld@octobus.net>
parents: 38466
diff changeset
   720
                    'in the working copy\n')
f4776f8b98e0 shelve: directly handle `--continue`
Boris Feld <boris.feld@octobus.net>
parents: 38466
diff changeset
   721
            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
   722
        else:
38467
f4776f8b98e0 shelve: directly handle `--continue`
Boris Feld <boris.feld@octobus.net>
parents: 38466
diff changeset
   723
            # only strip the shelvectx if we produced one
f4776f8b98e0 shelve: directly handle `--continue`
Boris Feld <boris.feld@octobus.net>
parents: 38466
diff changeset
   724
            state.nodestoremove.append(newnode)
f4776f8b98e0 shelve: directly handle `--continue`
Boris Feld <boris.feld@octobus.net>
parents: 38466
diff changeset
   725
            shelvectx = repo[newnode]
f4776f8b98e0 shelve: directly handle `--continue`
Boris Feld <boris.feld@octobus.net>
parents: 38466
diff changeset
   726
38512
39db5a01cd53 cleanup: pass in overwrite flag to hg.updaterepo() as named argument
Yuya Nishihara <yuya@tcha.org>
parents: 38467
diff changeset
   727
        hg.updaterepo(repo, pendingctx.node(), overwrite=False)
38467
f4776f8b98e0 shelve: directly handle `--continue`
Boris Feld <boris.feld@octobus.net>
parents: 38466
diff changeset
   728
f4776f8b98e0 shelve: directly handle `--continue`
Boris Feld <boris.feld@octobus.net>
parents: 38466
diff changeset
   729
        if repo.vfs.exists('unshelverebasestate'):
f4776f8b98e0 shelve: directly handle `--continue`
Boris Feld <boris.feld@octobus.net>
parents: 38466
diff changeset
   730
            repo.vfs.rename('unshelverebasestate', 'rebasestate')
f4776f8b98e0 shelve: directly handle `--continue`
Boris Feld <boris.feld@octobus.net>
parents: 38466
diff changeset
   731
            rebase.clearstatus(repo)
19961
1d7a36ff2615 shelve: use rebase instead of merge (issue4068)
Durham Goode <durham@fb.com>
parents: 19951
diff changeset
   732
20149
578b888c820e unshelve: don't commit unknown files during unshelve (issue4113)
Durham Goode <durham@fb.com>
parents: 20103
diff changeset
   733
        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
   734
        restorebranch(ui, repo, state.branchtorestore)
19961
1d7a36ff2615 shelve: use rebase instead of merge (issue4068)
Durham Goode <durham@fb.com>
parents: 19951
diff changeset
   735
31888
1c398f7f4aa4 shelve: rename nodestoprune to nodestoremove
Kostia Balytskyi <ikostia@fb.com>
parents: 31762
diff changeset
   736
        repair.strip(ui, repo, state.nodestoremove, backup=False,
1c398f7f4aa4 shelve: rename nodestoprune to nodestoremove
Kostia Balytskyi <ikostia@fb.com>
parents: 31762
diff changeset
   737
                     topic='shelve')
31669
1cbeefa59343 shelve: add logic to preserve active bookmarks
Kostia Balytskyi <ikostia@fb.com>
parents: 31561
diff changeset
   738
        _restoreactivebookmark(repo, state.activebookmark)
19961
1d7a36ff2615 shelve: use rebase instead of merge (issue4068)
Durham Goode <durham@fb.com>
parents: 19951
diff changeset
   739
        shelvedstate.clear(repo)
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   740
        unshelvecleanup(ui, repo, state.name, opts)
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   741
        ui.status(_("unshelve of '%s' complete\n") % state.name)
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   742
30462
2e736f01a710 shelve: move temporary commit creation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30417
diff changeset
   743
def _commitworkingcopychanges(ui, repo, opts, tmpwctx):
2e736f01a710 shelve: move temporary commit creation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30417
diff changeset
   744
    """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: 30417
diff changeset
   745
    # 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: 30417
diff changeset
   746
    # 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: 30417
diff changeset
   747
    s = repo.status()
2e736f01a710 shelve: move temporary commit creation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30417
diff changeset
   748
    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
   749
    if not (s.modified or s.added or s.removed):
30462
2e736f01a710 shelve: move temporary commit creation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30417
diff changeset
   750
        return tmpwctx, addedbefore
2e736f01a710 shelve: move temporary commit creation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30417
diff changeset
   751
    ui.status(_("temporarily committing pending changes "
2e736f01a710 shelve: move temporary commit creation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30417
diff changeset
   752
                "(restore with 'hg unshelve --abort')\n"))
2e736f01a710 shelve: move temporary commit creation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30417
diff changeset
   753
    commitfunc = getcommitfunc(extra=None, interactive=False,
2e736f01a710 shelve: move temporary commit creation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30417
diff changeset
   754
                               editor=False)
2e736f01a710 shelve: move temporary commit creation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30417
diff changeset
   755
    tempopts = {}
2e736f01a710 shelve: move temporary commit creation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30417
diff changeset
   756
    tempopts['message'] = "pending changes temporary commit"
2e736f01a710 shelve: move temporary commit creation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30417
diff changeset
   757
    tempopts['date'] = opts.get('date')
31762
473f2fcc7629 shelve: move ui.quiet manipulations to configoverride
Kostia Balytskyi <ikostia@fb.com>
parents: 31669
diff changeset
   758
    with ui.configoverride({('ui', 'quiet'): True}):
473f2fcc7629 shelve: move ui.quiet manipulations to configoverride
Kostia Balytskyi <ikostia@fb.com>
parents: 31669
diff changeset
   759
        node = cmdutil.commit(ui, repo, commitfunc, [], tempopts)
30462
2e736f01a710 shelve: move temporary commit creation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30417
diff changeset
   760
    tmpwctx = repo[node]
2e736f01a710 shelve: move temporary commit creation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30417
diff changeset
   761
    return tmpwctx, addedbefore
2e736f01a710 shelve: move temporary commit creation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30417
diff changeset
   762
31762
473f2fcc7629 shelve: move ui.quiet manipulations to configoverride
Kostia Balytskyi <ikostia@fb.com>
parents: 31669
diff changeset
   763
def _unshelverestorecommit(ui, repo, basename):
30463
672026aece64 shelve: move commit restoration logic to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30462
diff changeset
   764
    """Recreate commit in the repository during the unshelve"""
31762
473f2fcc7629 shelve: move ui.quiet manipulations to configoverride
Kostia Balytskyi <ikostia@fb.com>
parents: 31669
diff changeset
   765
    with ui.configoverride({('ui', 'quiet'): True}):
473f2fcc7629 shelve: move ui.quiet manipulations to configoverride
Kostia Balytskyi <ikostia@fb.com>
parents: 31669
diff changeset
   766
        shelvedfile(repo, basename, 'hg').applybundle()
473f2fcc7629 shelve: move ui.quiet manipulations to configoverride
Kostia Balytskyi <ikostia@fb.com>
parents: 31669
diff changeset
   767
        shelvectx = repo['tip']
30463
672026aece64 shelve: move commit restoration logic to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30462
diff changeset
   768
    return repo, shelvectx
672026aece64 shelve: move commit restoration logic to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30462
diff changeset
   769
30464
10684a298973 shelve: move rebasing logic to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30463
diff changeset
   770
def _rebaserestoredcommit(ui, repo, opts, tr, oldtiprev, basename, pctx,
31669
1cbeefa59343 shelve: add logic to preserve active bookmarks
Kostia Balytskyi <ikostia@fb.com>
parents: 31561
diff changeset
   771
                          tmpwctx, shelvectx, branchtorestore,
1cbeefa59343 shelve: add logic to preserve active bookmarks
Kostia Balytskyi <ikostia@fb.com>
parents: 31561
diff changeset
   772
                          activebookmark):
30464
10684a298973 shelve: move rebasing logic to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30463
diff changeset
   773
    """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: 30463
diff changeset
   774
    # 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: 30463
diff changeset
   775
    # we'll be merging with, rebase it to be on top.
10684a298973 shelve: move rebasing logic to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30463
diff changeset
   776
    if tmpwctx.node() == shelvectx.parents()[0].node():
10684a298973 shelve: move rebasing logic to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30463
diff changeset
   777
        return shelvectx
10684a298973 shelve: move rebasing logic to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30463
diff changeset
   778
38618
c829749e7639 shelve: directly handle the initial parent alignment
Boris Feld <boris.feld@octobus.net>
parents: 38512
diff changeset
   779
    overrides = {
c829749e7639 shelve: directly handle the initial parent alignment
Boris Feld <boris.feld@octobus.net>
parents: 38512
diff changeset
   780
        ('ui', 'forcemerge'): opts.get('tool', ''),
c829749e7639 shelve: directly handle the initial parent alignment
Boris Feld <boris.feld@octobus.net>
parents: 38512
diff changeset
   781
        ('phases', 'new-commit'): phases.secret,
c829749e7639 shelve: directly handle the initial parent alignment
Boris Feld <boris.feld@octobus.net>
parents: 38512
diff changeset
   782
    }
c829749e7639 shelve: directly handle the initial parent alignment
Boris Feld <boris.feld@octobus.net>
parents: 38512
diff changeset
   783
    with repo.ui.configoverride(overrides, 'unshelve'):
c829749e7639 shelve: directly handle the initial parent alignment
Boris Feld <boris.feld@octobus.net>
parents: 38512
diff changeset
   784
        ui.status(_('rebasing shelved changes\n'))
c829749e7639 shelve: directly handle the initial parent alignment
Boris Feld <boris.feld@octobus.net>
parents: 38512
diff changeset
   785
        stats = merge.graft(repo, shelvectx, shelvectx.p1(),
38619
9b077e5fa8ba shelve: use more accurate description in conflict marker
Boris Feld <boris.feld@octobus.net>
parents: 38618
diff changeset
   786
                           labels=['shelve', 'working-copy'],
38618
c829749e7639 shelve: directly handle the initial parent alignment
Boris Feld <boris.feld@octobus.net>
parents: 38512
diff changeset
   787
                           keepconflictparent=True)
c829749e7639 shelve: directly handle the initial parent alignment
Boris Feld <boris.feld@octobus.net>
parents: 38512
diff changeset
   788
        if stats.unresolvedcount:
c829749e7639 shelve: directly handle the initial parent alignment
Boris Feld <boris.feld@octobus.net>
parents: 38512
diff changeset
   789
            tr.close()
c829749e7639 shelve: directly handle the initial parent alignment
Boris Feld <boris.feld@octobus.net>
parents: 38512
diff changeset
   790
c829749e7639 shelve: directly handle the initial parent alignment
Boris Feld <boris.feld@octobus.net>
parents: 38512
diff changeset
   791
            nodestoremove = [repo.changelog.node(rev)
38823
e7aa113b14f7 global: use pycompat.xrange()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38715
diff changeset
   792
                             for rev in pycompat.xrange(oldtiprev, len(repo))]
38618
c829749e7639 shelve: directly handle the initial parent alignment
Boris Feld <boris.feld@octobus.net>
parents: 38512
diff changeset
   793
            shelvedstate.save(repo, basename, pctx, tmpwctx, nodestoremove,
c829749e7639 shelve: directly handle the initial parent alignment
Boris Feld <boris.feld@octobus.net>
parents: 38512
diff changeset
   794
                              branchtorestore, opts.get('keep'), activebookmark)
c829749e7639 shelve: directly handle the initial parent alignment
Boris Feld <boris.feld@octobus.net>
parents: 38512
diff changeset
   795
            raise error.InterventionRequired(
c829749e7639 shelve: directly handle the initial parent alignment
Boris Feld <boris.feld@octobus.net>
parents: 38512
diff changeset
   796
                _("unresolved conflicts (see 'hg resolve', then "
c829749e7639 shelve: directly handle the initial parent alignment
Boris Feld <boris.feld@octobus.net>
parents: 38512
diff changeset
   797
                  "'hg unshelve --continue')"))
30464
10684a298973 shelve: move rebasing logic to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30463
diff changeset
   798
38618
c829749e7639 shelve: directly handle the initial parent alignment
Boris Feld <boris.feld@octobus.net>
parents: 38512
diff changeset
   799
        with repo.dirstate.parentchange():
c829749e7639 shelve: directly handle the initial parent alignment
Boris Feld <boris.feld@octobus.net>
parents: 38512
diff changeset
   800
            repo.setparents(tmpwctx.node(), nodemod.nullid)
c829749e7639 shelve: directly handle the initial parent alignment
Boris Feld <boris.feld@octobus.net>
parents: 38512
diff changeset
   801
            newnode = repo.commit(text=shelvectx.description(),
c829749e7639 shelve: directly handle the initial parent alignment
Boris Feld <boris.feld@octobus.net>
parents: 38512
diff changeset
   802
                                  extra=shelvectx.extra(),
c829749e7639 shelve: directly handle the initial parent alignment
Boris Feld <boris.feld@octobus.net>
parents: 38512
diff changeset
   803
                                  user=shelvectx.user(),
c829749e7639 shelve: directly handle the initial parent alignment
Boris Feld <boris.feld@octobus.net>
parents: 38512
diff changeset
   804
                                  date=shelvectx.date())
30464
10684a298973 shelve: move rebasing logic to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30463
diff changeset
   805
38618
c829749e7639 shelve: directly handle the initial parent alignment
Boris Feld <boris.feld@octobus.net>
parents: 38512
diff changeset
   806
        if newnode is None:
c829749e7639 shelve: directly handle the initial parent alignment
Boris Feld <boris.feld@octobus.net>
parents: 38512
diff changeset
   807
            # If it ended up being a no-op commit, then the normal
c829749e7639 shelve: directly handle the initial parent alignment
Boris Feld <boris.feld@octobus.net>
parents: 38512
diff changeset
   808
            # merge state clean-up path doesn't happen, so do it
c829749e7639 shelve: directly handle the initial parent alignment
Boris Feld <boris.feld@octobus.net>
parents: 38512
diff changeset
   809
            # here. Fix issue5494
c829749e7639 shelve: directly handle the initial parent alignment
Boris Feld <boris.feld@octobus.net>
parents: 38512
diff changeset
   810
            merge.mergestate.clean(repo)
c829749e7639 shelve: directly handle the initial parent alignment
Boris Feld <boris.feld@octobus.net>
parents: 38512
diff changeset
   811
            shelvectx = tmpwctx
c829749e7639 shelve: directly handle the initial parent alignment
Boris Feld <boris.feld@octobus.net>
parents: 38512
diff changeset
   812
            msg = _('note: unshelved changes already existed '
c829749e7639 shelve: directly handle the initial parent alignment
Boris Feld <boris.feld@octobus.net>
parents: 38512
diff changeset
   813
                    'in the working copy\n')
c829749e7639 shelve: directly handle the initial parent alignment
Boris Feld <boris.feld@octobus.net>
parents: 38512
diff changeset
   814
            ui.status(msg)
c829749e7639 shelve: directly handle the initial parent alignment
Boris Feld <boris.feld@octobus.net>
parents: 38512
diff changeset
   815
        else:
c829749e7639 shelve: directly handle the initial parent alignment
Boris Feld <boris.feld@octobus.net>
parents: 38512
diff changeset
   816
            shelvectx = repo[newnode]
c829749e7639 shelve: directly handle the initial parent alignment
Boris Feld <boris.feld@octobus.net>
parents: 38512
diff changeset
   817
            hg.updaterepo(repo, tmpwctx.node(), False)
30464
10684a298973 shelve: move rebasing logic to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30463
diff changeset
   818
10684a298973 shelve: move rebasing logic to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30463
diff changeset
   819
    return shelvectx
10684a298973 shelve: move rebasing logic to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30463
diff changeset
   820
30465
b924375cce3a shelve: move file-forgetting logic to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30464
diff changeset
   821
def _forgetunknownfiles(repo, shelvectx, addedbefore):
b924375cce3a shelve: move file-forgetting logic to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30464
diff changeset
   822
    # 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: 30464
diff changeset
   823
    # unshelve started, but are now added.
b924375cce3a shelve: move file-forgetting logic to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30464
diff changeset
   824
    shelveunknown = shelvectx.extra().get('shelve_unknown')
b924375cce3a shelve: move file-forgetting logic to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30464
diff changeset
   825
    if not shelveunknown:
b924375cce3a shelve: move file-forgetting logic to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30464
diff changeset
   826
        return
b924375cce3a shelve: move file-forgetting logic to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30464
diff changeset
   827
    shelveunknown = frozenset(shelveunknown.split('\0'))
b924375cce3a shelve: move file-forgetting logic to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30464
diff changeset
   828
    addedafter = frozenset(repo.status().added)
b924375cce3a shelve: move file-forgetting logic to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30464
diff changeset
   829
    toforget = (addedafter & shelveunknown) - addedbefore
b924375cce3a shelve: move file-forgetting logic to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30464
diff changeset
   830
    repo[None].forget(toforget)
b924375cce3a shelve: move file-forgetting logic to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30464
diff changeset
   831
31669
1cbeefa59343 shelve: add logic to preserve active bookmarks
Kostia Balytskyi <ikostia@fb.com>
parents: 31561
diff changeset
   832
def _finishunshelve(repo, oldtiprev, tr, activebookmark):
1cbeefa59343 shelve: add logic to preserve active bookmarks
Kostia Balytskyi <ikostia@fb.com>
parents: 31561
diff changeset
   833
    _restoreactivebookmark(repo, activebookmark)
30466
893be22cdb38 shelve: move unshelve-finishing logic to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30465
diff changeset
   834
    # 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: 30465
diff changeset
   835
    # 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: 30465
diff changeset
   836
    # 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: 30465
diff changeset
   837
    # Clean up manually to prevent this.
893be22cdb38 shelve: move unshelve-finishing logic to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30465
diff changeset
   838
    repo.unfiltered().changelog.strip(oldtiprev, tr)
893be22cdb38 shelve: move unshelve-finishing logic to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30465
diff changeset
   839
    _aborttransaction(repo)
893be22cdb38 shelve: move unshelve-finishing logic to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30465
diff changeset
   840
30846
dfc6663f97ca shelve: make unshelve not crash when there are missing files (issue4176)
Kostia Balytskyi <ikostia@fb.com>
parents: 30823
diff changeset
   841
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
   842
    """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
   843
    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
   844
    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
   845
    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
   846
    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
   847
    if intersection:
dfc6663f97ca shelve: make unshelve not crash when there are missing files (issue4176)
Kostia Balytskyi <ikostia@fb.com>
parents: 30823
diff changeset
   848
        m = _("shelved change touches missing files")
dfc6663f97ca shelve: make unshelve not crash when there are missing files (issue4176)
Kostia Balytskyi <ikostia@fb.com>
parents: 30823
diff changeset
   849
        hint = _("run hg status to see which files are missing")
dfc6663f97ca shelve: make unshelve not crash when there are missing files (issue4176)
Kostia Balytskyi <ikostia@fb.com>
parents: 30823
diff changeset
   850
        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
   851
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   852
@command('unshelve',
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   853
         [('a', 'abort', None,
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   854
           _('abort an incomplete unshelve operation')),
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   855
          ('c', 'continue', None,
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   856
           _('continue an incomplete unshelve operation')),
27019
5cf184398ee7 unshelve: add -k as short form of --keep
Siddharth Agarwal <sid0@fb.com>
parents: 26992
diff changeset
   857
          ('k', 'keep', None,
20960
8e5b21ce8ee9 shelve: introduce secret option for using fixed date for temporary commit
Mads Kiilerich <madski@unity3d.com>
parents: 20958
diff changeset
   858
           _('keep shelve after unshelving')),
31041
4189d790e8a4 shelve: add -n/--name option to unshelve (issue5475)
liscju <piotr.listkiewicz@gmail.com>
parents: 30846
diff changeset
   859
          ('n', 'name', '',
4189d790e8a4 shelve: add -n/--name option to unshelve (issue5475)
liscju <piotr.listkiewicz@gmail.com>
parents: 30846
diff changeset
   860
           _('restore shelved change with given name'), _('NAME')),
27021
f2554154509f unshelve: add support for custom merge tools
Siddharth Agarwal <sid0@fb.com>
parents: 27020
diff changeset
   861
          ('t', 'tool', '', _('specify merge tool')),
20960
8e5b21ce8ee9 shelve: introduce secret option for using fixed date for temporary commit
Mads Kiilerich <madski@unity3d.com>
parents: 20958
diff changeset
   862
          ('', 'date', '',
8e5b21ce8ee9 shelve: introduce secret option for using fixed date for temporary commit
Mads Kiilerich <madski@unity3d.com>
parents: 20958
diff changeset
   863
           _('set date for temporary commits (DEPRECATED)'), _('DATE'))],
31041
4189d790e8a4 shelve: add -n/--name option to unshelve (issue5475)
liscju <piotr.listkiewicz@gmail.com>
parents: 30846
diff changeset
   864
         _('hg unshelve [[-n] SHELVED]'))
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   865
def unshelve(ui, repo, *shelved, **opts):
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   866
    """restore a shelved change to the working directory
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   867
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   868
    This command accepts an optional name of a shelved change to
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   869
    restore. If none is given, the most recent shelved change is used.
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   870
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   871
    If a shelved change is applied successfully, the bundle that
25712
8a6264a2ee60 shelve: always backup shelves instead of deleting them
Colin Chan <colinchan@fb.com>
parents: 25660
diff changeset
   872
    contains the shelved changes is moved to a backup location
8a6264a2ee60 shelve: always backup shelves instead of deleting them
Colin Chan <colinchan@fb.com>
parents: 25660
diff changeset
   873
    (.hg/shelve-backup).
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   874
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   875
    Since you can restore a shelved change on top of an arbitrary
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   876
    commit, it is possible that unshelving will result in a conflict
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   877
    between your changes and the commits you are unshelving onto. If
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   878
    this occurs, you must resolve the conflict, then use
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   879
    ``--continue`` to complete the unshelve operation. (The bundle
25712
8a6264a2ee60 shelve: always backup shelves instead of deleting them
Colin Chan <colinchan@fb.com>
parents: 25660
diff changeset
   880
    will not be moved until you successfully complete the unshelve.)
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   881
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   882
    (Alternatively, you can use ``--abort`` to abandon an unshelve
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   883
    that causes a conflict. This reverts the unshelved changes, and
25712
8a6264a2ee60 shelve: always backup shelves instead of deleting them
Colin Chan <colinchan@fb.com>
parents: 25660
diff changeset
   884
    leaves the bundle in place.)
25713
2ca116614cfc shelve: only keep the latest N shelve backups
Colin Chan <colinchan@fb.com>
parents: 25712
diff changeset
   885
28573
6a42564081cb shelve: adds restoring newly created branch (issue5048) (BC)
liscju <piotr.listkiewicz@gmail.com>
parents: 28572
diff changeset
   886
    If bare shelved change(when no files are specified, without interactive,
6a42564081cb shelve: adds restoring newly created branch (issue5048) (BC)
liscju <piotr.listkiewicz@gmail.com>
parents: 28572
diff changeset
   887
    include and exclude option) was done on newly created branch it would
6a42564081cb shelve: adds restoring newly created branch (issue5048) (BC)
liscju <piotr.listkiewicz@gmail.com>
parents: 28572
diff changeset
   888
    restore branch information to the working directory.
6a42564081cb shelve: adds restoring newly created branch (issue5048) (BC)
liscju <piotr.listkiewicz@gmail.com>
parents: 28572
diff changeset
   889
25713
2ca116614cfc shelve: only keep the latest N shelve backups
Colin Chan <colinchan@fb.com>
parents: 25712
diff changeset
   890
    After a successful unshelve, the shelved changes are stored in a
2ca116614cfc shelve: only keep the latest N shelve backups
Colin Chan <colinchan@fb.com>
parents: 25712
diff changeset
   891
    backup directory. Only the N most recent backups are kept. N
25852
870e361e049c shelve: make maxbackup doc check-config friendly
Matt Mackall <mpm@selenic.com>
parents: 25799
diff changeset
   892
    defaults to 10 but can be overridden using the ``shelve.maxbackups``
25713
2ca116614cfc shelve: only keep the latest N shelve backups
Colin Chan <colinchan@fb.com>
parents: 25712
diff changeset
   893
    configuration option.
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
   894
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
   895
    .. container:: verbose
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
   896
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
   897
       Timestamp in seconds is used to decide order of backups. More
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
   898
       than ``maxbackups`` backups are kept, if same timestamp
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
   899
       prevents from deciding exact order of them, for safety.
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   900
    """
27837
496ca4deddc5 with: use context manager for wlock in unshelve
Bryan O'Sullivan <bryano@fb.com>
parents: 27836
diff changeset
   901
    with repo.wlock():
27287
c9ceea3f2d8e shelve: widen wlock scope of unshelve for consistency while processing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 27198
diff changeset
   902
        return _dounshelve(ui, repo, *shelved, **opts)
c9ceea3f2d8e shelve: widen wlock scope of unshelve for consistency while processing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 27198
diff changeset
   903
c9ceea3f2d8e shelve: widen wlock scope of unshelve for consistency while processing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 27198
diff changeset
   904
def _dounshelve(ui, repo, *shelved, **opts):
35046
aad6b9fdfc75 py3: handle keyword arguments in hgext/shelve.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34496
diff changeset
   905
    opts = pycompat.byteskwargs(opts)
28401
2565fe39a76c shelve: changes getting opts values by get method
liscju <piotr.listkiewicz@gmail.com>
parents: 28378
diff changeset
   906
    abortf = opts.get('abort')
2565fe39a76c shelve: changes getting opts values by get method
liscju <piotr.listkiewicz@gmail.com>
parents: 28378
diff changeset
   907
    continuef = opts.get('continue')
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   908
    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
   909
        cmdutil.checkunfinished(repo)
31041
4189d790e8a4 shelve: add -n/--name option to unshelve (issue5475)
liscju <piotr.listkiewicz@gmail.com>
parents: 30846
diff changeset
   910
    shelved = list(shelved)
4189d790e8a4 shelve: add -n/--name option to unshelve (issue5475)
liscju <piotr.listkiewicz@gmail.com>
parents: 30846
diff changeset
   911
    if opts.get("name"):
4189d790e8a4 shelve: add -n/--name option to unshelve (issue5475)
liscju <piotr.listkiewicz@gmail.com>
parents: 30846
diff changeset
   912
        shelved.append(opts["name"])
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   913
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   914
    if abortf or continuef:
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   915
        if abortf and continuef:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26577
diff changeset
   916
            raise error.Abort(_('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
   917
        if shelved:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26577
diff changeset
   918
            raise error.Abort(_('cannot combine abort/continue with '
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   919
                               'naming a shelved change'))
27021
f2554154509f unshelve: add support for custom merge tools
Siddharth Agarwal <sid0@fb.com>
parents: 27020
diff changeset
   920
        if abortf and opts.get('tool', False):
f2554154509f unshelve: add support for custom merge tools
Siddharth Agarwal <sid0@fb.com>
parents: 27020
diff changeset
   921
            ui.warn(_('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
   922
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   923
        try:
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   924
            state = shelvedstate.load(repo)
30531
7b3136bc7bfd shelve: make --keep option survive user intervention (issue5431)
Kostia Balytskyi <ikostia@fb.com>
parents: 30466
diff changeset
   925
            if opts.get('keep') is None:
7b3136bc7bfd shelve: make --keep option survive user intervention (issue5431)
Kostia Balytskyi <ikostia@fb.com>
parents: 30466
diff changeset
   926
                opts['keep'] = state.keep
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25260
diff changeset
   927
        except IOError as err:
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   928
            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
   929
                raise
28124
983365382465 shelve: suggest the correct tool to continue (not unshelve)
timeless <timeless@mozdev.org>
parents: 27931
diff changeset
   930
            cmdutil.wrongtooltocontinue(repo, _('unshelve'))
29536
b17a6e3cd2ac shelve: make unshelve be able to abort in any case
Kostia Balytskyi <ikostia@fb.com>
parents: 29270
diff changeset
   931
        except error.CorruptedState as err:
36526
7af7443877da py3: replace str() with it's bytes equivalent in hgext/shelve.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 36223
diff changeset
   932
            ui.debug(pycompat.bytestr(err) + '\n')
29536
b17a6e3cd2ac shelve: make unshelve be able to abort in any case
Kostia Balytskyi <ikostia@fb.com>
parents: 29270
diff changeset
   933
            if continuef:
b17a6e3cd2ac shelve: make unshelve be able to abort in any case
Kostia Balytskyi <ikostia@fb.com>
parents: 29270
diff changeset
   934
                msg = _('corrupted shelved state file')
b17a6e3cd2ac shelve: make unshelve be able to abort in any case
Kostia Balytskyi <ikostia@fb.com>
parents: 29270
diff changeset
   935
                hint = _('please run hg unshelve --abort to abort unshelve '
b17a6e3cd2ac shelve: make unshelve be able to abort in any case
Kostia Balytskyi <ikostia@fb.com>
parents: 29270
diff changeset
   936
                         'operation')
b17a6e3cd2ac shelve: make unshelve be able to abort in any case
Kostia Balytskyi <ikostia@fb.com>
parents: 29270
diff changeset
   937
                raise error.Abort(msg, hint=hint)
b17a6e3cd2ac shelve: make unshelve be able to abort in any case
Kostia Balytskyi <ikostia@fb.com>
parents: 29270
diff changeset
   938
            elif abortf:
b17a6e3cd2ac shelve: make unshelve be able to abort in any case
Kostia Balytskyi <ikostia@fb.com>
parents: 29270
diff changeset
   939
                msg = _('could not read shelved state file, your working copy '
b17a6e3cd2ac shelve: make unshelve be able to abort in any case
Kostia Balytskyi <ikostia@fb.com>
parents: 29270
diff changeset
   940
                        'may be in an unexpected state\nplease update to some '
b17a6e3cd2ac shelve: make unshelve be able to abort in any case
Kostia Balytskyi <ikostia@fb.com>
parents: 29270
diff changeset
   941
                        'commit\n')
b17a6e3cd2ac shelve: make unshelve be able to abort in any case
Kostia Balytskyi <ikostia@fb.com>
parents: 29270
diff changeset
   942
                ui.warn(msg)
b17a6e3cd2ac shelve: make unshelve be able to abort in any case
Kostia Balytskyi <ikostia@fb.com>
parents: 29270
diff changeset
   943
                shelvedstate.clear(repo)
b17a6e3cd2ac shelve: make unshelve be able to abort in any case
Kostia Balytskyi <ikostia@fb.com>
parents: 29270
diff changeset
   944
            return
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   945
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   946
        if abortf:
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   947
            return unshelveabort(ui, repo, state, opts)
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   948
        elif continuef:
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   949
            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
   950
    elif len(shelved) > 1:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26577
diff changeset
   951
        raise error.Abort(_('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
   952
    elif not shelved:
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   953
        shelved = listshelves(repo)
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   954
        if not shelved:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26577
diff changeset
   955
            raise error.Abort(_('no shelved changes to apply!'))
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   956
        basename = util.split(shelved[0][1])[1]
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   957
        ui.status(_("unshelving change '%s'\n") % basename)
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   958
    else:
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   959
        basename = shelved[0]
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   960
30560
1775975dd439 shelve: move patch extension to a string constant
Kostia Balytskyi <ikostia@fb.com>
parents: 30551
diff changeset
   961
    if not shelvedfile(repo, basename, patchextension).exists():
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26577
diff changeset
   962
        raise error.Abort(_("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
   963
27287
c9ceea3f2d8e shelve: widen wlock scope of unshelve for consistency while processing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 27198
diff changeset
   964
    lock = tr = None
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   965
    try:
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   966
        lock = repo.lock()
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   967
        tr = repo.transaction('unshelve', report=lambda x: None)
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   968
        oldtiprev = len(repo)
19961
1d7a36ff2615 shelve: use rebase instead of merge (issue4068)
Durham Goode <durham@fb.com>
parents: 19951
diff changeset
   969
20958
df33c9014430 shelve: repo['.'] is not a wctx but a pctx
Mads Kiilerich <madski@unity3d.com>
parents: 20942
diff changeset
   970
        pctx = repo['.']
df33c9014430 shelve: repo['.'] is not a wctx but a pctx
Mads Kiilerich <madski@unity3d.com>
parents: 20942
diff changeset
   971
        tmpwctx = pctx
19961
1d7a36ff2615 shelve: use rebase instead of merge (issue4068)
Durham Goode <durham@fb.com>
parents: 19951
diff changeset
   972
        # 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
   973
        # ...-> pctx -> tmpwctx -> shelvectx
19961
1d7a36ff2615 shelve: use rebase instead of merge (issue4068)
Durham Goode <durham@fb.com>
parents: 19951
diff changeset
   974
        # 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
   975
        # 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
   976
        # to the original pctx.
19961
1d7a36ff2615 shelve: use rebase instead of merge (issue4068)
Durham Goode <durham@fb.com>
parents: 19951
diff changeset
   977
31669
1cbeefa59343 shelve: add logic to preserve active bookmarks
Kostia Balytskyi <ikostia@fb.com>
parents: 31561
diff changeset
   978
        activebookmark = _backupactivebookmark(repo)
38011
7932be8b0559 shelve: reduce scope of merge tool config override
Martin von Zweigbergk <martinvonz@google.com>
parents: 37603
diff changeset
   979
        tmpwctx, addedbefore = _commitworkingcopychanges(ui, repo, opts,
7932be8b0559 shelve: reduce scope of merge tool config override
Martin von Zweigbergk <martinvonz@google.com>
parents: 37603
diff changeset
   980
                                                         tmpwctx)
7932be8b0559 shelve: reduce scope of merge tool config override
Martin von Zweigbergk <martinvonz@google.com>
parents: 37603
diff changeset
   981
        repo, shelvectx = _unshelverestorecommit(ui, repo, basename)
7932be8b0559 shelve: reduce scope of merge tool config override
Martin von Zweigbergk <martinvonz@google.com>
parents: 37603
diff changeset
   982
        _checkunshelveuntrackedproblems(ui, repo, shelvectx)
7932be8b0559 shelve: reduce scope of merge tool config override
Martin von Zweigbergk <martinvonz@google.com>
parents: 37603
diff changeset
   983
        branchtorestore = ''
7932be8b0559 shelve: reduce scope of merge tool config override
Martin von Zweigbergk <martinvonz@google.com>
parents: 37603
diff changeset
   984
        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
   985
            branchtorestore = shelvectx.branch()
7932be8b0559 shelve: reduce scope of merge tool config override
Martin von Zweigbergk <martinvonz@google.com>
parents: 37603
diff changeset
   986
7932be8b0559 shelve: reduce scope of merge tool config override
Martin von Zweigbergk <martinvonz@google.com>
parents: 37603
diff changeset
   987
        shelvectx = _rebaserestoredcommit(ui, repo, opts, tr, oldtiprev,
7932be8b0559 shelve: reduce scope of merge tool config override
Martin von Zweigbergk <martinvonz@google.com>
parents: 37603
diff changeset
   988
                                          basename, pctx, tmpwctx,
7932be8b0559 shelve: reduce scope of merge tool config override
Martin von Zweigbergk <martinvonz@google.com>
parents: 37603
diff changeset
   989
                                          shelvectx, branchtorestore,
7932be8b0559 shelve: reduce scope of merge tool config override
Martin von Zweigbergk <martinvonz@google.com>
parents: 37603
diff changeset
   990
                                          activebookmark)
31471
d1ce2124ec83 shelve: get rid of ui.backupconfig
Jun Wu <quark@fb.com>
parents: 31344
diff changeset
   991
        overrides = {('ui', 'forcemerge'): opts.get('tool', '')}
d1ce2124ec83 shelve: get rid of ui.backupconfig
Jun Wu <quark@fb.com>
parents: 31344
diff changeset
   992
        with ui.configoverride(overrides, 'unshelve'):
38011
7932be8b0559 shelve: reduce scope of merge tool config override
Martin von Zweigbergk <martinvonz@google.com>
parents: 37603
diff changeset
   993
            mergefiles(ui, repo, pctx, shelvectx)
7932be8b0559 shelve: reduce scope of merge tool config override
Martin von Zweigbergk <martinvonz@google.com>
parents: 37603
diff changeset
   994
        restorebranch(ui, repo, branchtorestore)
7932be8b0559 shelve: reduce scope of merge tool config override
Martin von Zweigbergk <martinvonz@google.com>
parents: 37603
diff changeset
   995
        _forgetunknownfiles(repo, shelvectx, addedbefore)
27908
d73a5ab18015 shelve: permit shelves to contain unknown files
Simon Farnsworth <simonfar@fb.com>
parents: 27888
diff changeset
   996
38011
7932be8b0559 shelve: reduce scope of merge tool config override
Martin von Zweigbergk <martinvonz@google.com>
parents: 37603
diff changeset
   997
        shelvedstate.clear(repo)
7932be8b0559 shelve: reduce scope of merge tool config override
Martin von Zweigbergk <martinvonz@google.com>
parents: 37603
diff changeset
   998
        _finishunshelve(repo, oldtiprev, tr, activebookmark)
7932be8b0559 shelve: reduce scope of merge tool config override
Martin von Zweigbergk <martinvonz@google.com>
parents: 37603
diff changeset
   999
        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
  1000
    finally:
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
  1001
        if tr:
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
  1002
            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
  1003
        lockmod.release(lock)
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
  1004
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
  1005
@command('shelve',
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
  1006
         [('A', 'addremove', None,
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
  1007
           _('mark new/missing files as added/removed before shelving')),
27908
d73a5ab18015 shelve: permit shelves to contain unknown files
Simon Farnsworth <simonfar@fb.com>
parents: 27888
diff changeset
  1008
          ('u', 'unknown', None,
27921
158bdc896572 shelve: lowercase flag description
timeless <timeless@mozdev.org>
parents: 27908
diff changeset
  1009
           _('store unknown files in the shelve')),
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
  1010
          ('', 'cleanup', None,
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
  1011
           _('delete all shelved changes')),
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
  1012
          ('', 'date', '',
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
  1013
           _('shelve with the specified commit date'), _('DATE')),
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
  1014
          ('d', 'delete', None,
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
  1015
           _('delete the named shelved change(s)')),
21852
37a5decc6924 shelve: accept '--edit' like other commands creating new changeset
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21851
diff changeset
  1016
          ('e', 'edit', False,
37a5decc6924 shelve: accept '--edit' like other commands creating new changeset
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21851
diff changeset
  1017
           _('invoke editor on commit messages')),
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
  1018
          ('l', 'list', None,
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
  1019
           _('list current shelves')),
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
  1020
          ('m', 'message', '',
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
  1021
           _('use text as shelve message'), _('TEXT')),
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
  1022
          ('n', 'name', '',
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
  1023
           _('use the given name for the shelved commit'), _('NAME')),
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
  1024
          ('p', 'patch', None,
38714
abcf500d527c shelve: improve help text for --patch and --stat
Danny Hooper <hooper@google.com>
parents: 38619
diff changeset
  1025
           _('output patches for changes (provide the names of the shelved '
abcf500d527c shelve: improve help text for --patch and --stat
Danny Hooper <hooper@google.com>
parents: 38619
diff changeset
  1026
             'changes as positional arguments)')),
24477
325f03de849d shelve: add interactive mode command line option
Laurent Charignon <lcharignon@fb.com>
parents: 23895
diff changeset
  1027
          ('i', 'interactive', None,
25260
8fa3e995a375 selve: make 'shelve --interactive' not experimental
Laurent Charignon <lcharignon@fb.com>
parents: 25186
diff changeset
  1028
           _('interactive mode, only works while creating a shelve')),
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
  1029
          ('', 'stat', None,
38714
abcf500d527c shelve: improve help text for --patch and --stat
Danny Hooper <hooper@google.com>
parents: 38619
diff changeset
  1030
           _('output diffstat-style summary of changes (provide the names of '
abcf500d527c shelve: improve help text for --patch and --stat
Danny Hooper <hooper@google.com>
parents: 38619
diff changeset
  1031
             'the shelved changes as positional arguments)')
abcf500d527c shelve: improve help text for --patch and --stat
Danny Hooper <hooper@google.com>
parents: 38619
diff changeset
  1032
           )] + cmdutil.walkopts,
20410
fc5354648224 shelve: mention FILE options in help
Mads Kiilerich <madski@unity3d.com>
parents: 20409
diff changeset
  1033
         _('hg shelve [OPTION]... [FILE]...'))
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
  1034
def shelvecmd(ui, repo, *pats, **opts):
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
  1035
    '''save and set aside changes from the working directory
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
  1036
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
  1037
    Shelving takes files that "hg status" reports as not clean, saves
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
  1038
    the modifications to a bundle (a shelved change), and reverts the
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
  1039
    files so that their state in the working directory becomes clean.
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
  1040
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
  1041
    To restore these changes to the working directory, using "hg
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
  1042
    unshelve"; this will work even if you switch to a different
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
  1043
    commit.
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
  1044
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
  1045
    When no files are specified, "hg shelve" saves all not-clean
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
  1046
    files. If specific files or directories are named, only changes to
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
  1047
    those files are shelved.
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
  1048
30256
819f96b82fa4 shelve: add missing space in help text
Mads Kiilerich <madski@unity3d.com>
parents: 29852
diff changeset
  1049
    In bare shelve (when no files are specified, without interactive,
28573
6a42564081cb shelve: adds restoring newly created branch (issue5048) (BC)
liscju <piotr.listkiewicz@gmail.com>
parents: 28572
diff changeset
  1050
    include and exclude option), shelving remembers information if the
6a42564081cb shelve: adds restoring newly created branch (issue5048) (BC)
liscju <piotr.listkiewicz@gmail.com>
parents: 28572
diff changeset
  1051
    working directory was on newly created branch, in other words working
6a42564081cb shelve: adds restoring newly created branch (issue5048) (BC)
liscju <piotr.listkiewicz@gmail.com>
parents: 28572
diff changeset
  1052
    directory was on different branch than its first parent. In this
6a42564081cb shelve: adds restoring newly created branch (issue5048) (BC)
liscju <piotr.listkiewicz@gmail.com>
parents: 28572
diff changeset
  1053
    situation unshelving restores branch information to the working directory.
6a42564081cb shelve: adds restoring newly created branch (issue5048) (BC)
liscju <piotr.listkiewicz@gmail.com>
parents: 28572
diff changeset
  1054
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
  1055
    Each shelved change has a name that makes it easier to find later.
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
  1056
    The name of a shelved change defaults to being based on the active
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
  1057
    bookmark, or if there is no active bookmark, the current named
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
  1058
    branch.  To specify a different name, use ``--name``.
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
  1059
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
  1060
    To see a list of existing shelved changes, use the ``--list``
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
  1061
    option. For each shelved change, this will print its name, age,
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
  1062
    and description; use ``--patch`` or ``--stat`` for more details.
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
  1063
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
  1064
    To delete specific shelved changes, use ``--delete``. To delete
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
  1065
    all shelved changes, use ``--cleanup``.
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
  1066
    '''
35046
aad6b9fdfc75 py3: handle keyword arguments in hgext/shelve.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34496
diff changeset
  1067
    opts = pycompat.byteskwargs(opts)
21851
aad28ff87788 shelve: refactor option combination check to easily add new ones
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21064
diff changeset
  1068
    allowables = [
32331
bd872f64a8ba cleanup: use set literals
Martin von Zweigbergk <martinvonz@google.com>
parents: 32325
diff changeset
  1069
        ('addremove', {'create'}), # 'create' is pseudo action
bd872f64a8ba cleanup: use set literals
Martin von Zweigbergk <martinvonz@google.com>
parents: 32325
diff changeset
  1070
        ('unknown', {'create'}),
bd872f64a8ba cleanup: use set literals
Martin von Zweigbergk <martinvonz@google.com>
parents: 32325
diff changeset
  1071
        ('cleanup', {'cleanup'}),
bd872f64a8ba cleanup: use set literals
Martin von Zweigbergk <martinvonz@google.com>
parents: 32325
diff changeset
  1072
#       ('date', {'create'}), # ignored for passing '--date "0 0"' in tests
bd872f64a8ba cleanup: use set literals
Martin von Zweigbergk <martinvonz@google.com>
parents: 32325
diff changeset
  1073
        ('delete', {'delete'}),
bd872f64a8ba cleanup: use set literals
Martin von Zweigbergk <martinvonz@google.com>
parents: 32325
diff changeset
  1074
        ('edit', {'create'}),
bd872f64a8ba cleanup: use set literals
Martin von Zweigbergk <martinvonz@google.com>
parents: 32325
diff changeset
  1075
        ('list', {'list'}),
bd872f64a8ba cleanup: use set literals
Martin von Zweigbergk <martinvonz@google.com>
parents: 32325
diff changeset
  1076
        ('message', {'create'}),
bd872f64a8ba cleanup: use set literals
Martin von Zweigbergk <martinvonz@google.com>
parents: 32325
diff changeset
  1077
        ('name', {'create'}),
bd872f64a8ba cleanup: use set literals
Martin von Zweigbergk <martinvonz@google.com>
parents: 32325
diff changeset
  1078
        ('patch', {'patch', 'list'}),
bd872f64a8ba cleanup: use set literals
Martin von Zweigbergk <martinvonz@google.com>
parents: 32325
diff changeset
  1079
        ('stat', {'stat', 'list'}),
21851
aad28ff87788 shelve: refactor option combination check to easily add new ones
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21064
diff changeset
  1080
    ]
aad28ff87788 shelve: refactor option combination check to easily add new ones
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21064
diff changeset
  1081
    def checkopt(opt):
28401
2565fe39a76c shelve: changes getting opts values by get method
liscju <piotr.listkiewicz@gmail.com>
parents: 28378
diff changeset
  1082
        if opts.get(opt):
21851
aad28ff87788 shelve: refactor option combination check to easily add new ones
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21064
diff changeset
  1083
            for i, allowable in allowables:
25103
ce00b2e96d09 shelve: refactor allowables to specify sets of valid operations
Tony Tung <tonytung@fb.com>
parents: 25080
diff changeset
  1084
                if opts[i] and opt not in allowable:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26577
diff changeset
  1085
                    raise error.Abort(_("options '--%s' and '--%s' may not be "
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
  1086
                                       "used together") % (opt, i))
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
  1087
            return True
21851
aad28ff87788 shelve: refactor option combination check to easily add new ones
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21064
diff changeset
  1088
    if checkopt('cleanup'):
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
  1089
        if pats:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26577
diff changeset
  1090
            raise error.Abort(_("cannot specify names when using '--cleanup'"))
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
  1091
        return cleanupcmd(ui, repo)
21851
aad28ff87788 shelve: refactor option combination check to easily add new ones
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21064
diff changeset
  1092
    elif checkopt('delete'):
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
  1093
        return deletecmd(ui, repo, pats)
21851
aad28ff87788 shelve: refactor option combination check to easily add new ones
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21064
diff changeset
  1094
    elif checkopt('list'):
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
  1095
        return listcmd(ui, repo, pats, opts)
38715
905b66681004 shelve: pick the most recent shelve if none specified for --patch/--stat
Danny Hooper <hooper@google.com>
parents: 38714
diff changeset
  1096
    elif checkopt('patch') or checkopt('stat'):
905b66681004 shelve: pick the most recent shelve if none specified for --patch/--stat
Danny Hooper <hooper@google.com>
parents: 38714
diff changeset
  1097
        return patchcmds(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
  1098
    else:
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
  1099
        return createcmd(ui, repo, pats, opts)
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
  1100
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
  1101
def extsetup(ui):
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
  1102
    cmdutil.unfinishedstates.append(
19963
6f29cc567845 shelve: disallow commit while unshelve is in progress
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19961
diff changeset
  1103
        [shelvedstate._filename, False, False,
6f29cc567845 shelve: disallow commit while unshelve is in progress
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19961
diff changeset
  1104
         _('unshelve already in progress'),
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
  1105
         _("use 'hg unshelve --continue' or 'hg unshelve --abort'")])
27694
2dc363274702 shelve: hook afterresolvedstates
timeless <timeless@mozdev.org>
parents: 27651
diff changeset
  1106
    cmdutil.afterresolvedstates.append(
2dc363274702 shelve: hook afterresolvedstates
timeless <timeless@mozdev.org>
parents: 27651
diff changeset
  1107
        [shelvedstate._filename, _('hg unshelve --continue')])