usr/src/tools/onbld/Scm/WorkSpace.py
author Mark J. Nelson <Mark.J.Nelson@Sun.COM>
Wed, 06 Aug 2008 16:29:39 -0600
changeset 7298 b69e27387f74
parent 7078 935563142864
child 9006 c03e0483bda8
permissions -rw-r--r--
6733918 Teamware has retired, please welcome your new manager, Mercurial 4758439 some files use "current date" sccs keywords 6560843 asm sources should not rely on .file "%M%" for naming STT_FILE symbols 6560958 Solaris:: perl modules should not use SCCS keywords in version information 6729074 webrev doesn't deal well with remote ssh hg parents
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
7078
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
     1
#
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
     2
#  This program is free software; you can redistribute it and/or modify
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
     3
#  it under the terms of the GNU General Public License version 2
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
     4
#  as published by the Free Software Foundation.
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
     5
#
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
     6
#  This program is distributed in the hope that it will be useful,
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
     7
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
     8
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
     9
#  GNU General Public License for more details.
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
    10
#
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
    11
#  You should have received a copy of the GNU General Public License
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
    12
#  along with this program; if not, write to the Free Software
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
    13
#  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
    14
#
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
    15
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
    16
#
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
    17
# Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
    18
# Use is subject to license terms.
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
    19
#
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
    20
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
    21
#
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
    22
# Theory:
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
    23
#
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
    24
# Workspaces have a non-binding parent/child relationship.
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
    25
# All important operations apply to the changes between the two.
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
    26
#
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
    27
# However, for the sake of remote operation, the 'parent' of a
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
    28
# workspace is not seen as a literal entity, instead the figurative
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
    29
# parent contains the last changeset common to both parent and child,
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
    30
# as such the 'parent tip' is actually nothing of the sort, but instead a
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
    31
# convenient imitation.
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
    32
#
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
    33
# Any change made to a workspace is a change to a file therein, such
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
    34
# changes can be represented briefly as whether the file was
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
    35
# modified/added/removed as compared to the parent workspace, whether
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
    36
# the file has a different name in the parent and if so, whether it
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
    37
# was renamed or merely copied.  Each changed file has an
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
    38
# associated ActiveEntry.
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
    39
#
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
    40
# The ActiveList being a list ActiveEntrys can thus present the entire
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
    41
# change in workspace state between a parent and its child, and is the
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
    42
# important bit here (in that if it is incorrect, everything else will
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
    43
# be as incorrect, or more)
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
    44
#
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
    45
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
    46
import cStringIO
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
    47
import os
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
    48
from mercurial import hg, patch, cmdutil, util, node, repo
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
    49
from mercurial import revlog, repair
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
    50
from hgext import mq
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
    51
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
    52
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
    53
class ActiveEntry(object):
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
    54
    '''Representation of the changes made to a single file.
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
    55
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
    56
    MODIFIED   - Contents changed, but no other changes were made
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
    57
    ADDED      - File is newly created
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
    58
    REMOVED    - File is being removed
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
    59
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
    60
    Copies are represented by an Entry whose .parentname is non-nil
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
    61
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
    62
    Truly copied files have non-nil .parentname and .renamed = False
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
    63
    Renames have non-nil .parentname and .renamed = True
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
    64
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
    65
    Do not access any of this information directly, do so via the
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
    66
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
    67
    .is_<change>() methods.'''
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
    68
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
    69
    MODIFIED = 1
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
    70
    ADDED = 2
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
    71
    REMOVED = 3
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
    72
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
    73
    def __init__(self, name):
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
    74
        self.name = name
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
    75
        self.change = None
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
    76
        self.parentname = None
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
    77
        # As opposed to copied (or neither)
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
    78
        self.renamed = False
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
    79
        self.comments = []
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
    80
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
    81
    #
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
    82
    # ActiveEntrys sort by the name of the file they represent.
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
    83
    #
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
    84
    def __cmp__(self, other):
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
    85
        return cmp(self.name, other.name)
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
    86
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
    87
    def is_added(self):
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
    88
        return self.change == self.ADDED
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
    89
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
    90
    def is_modified(self):
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
    91
        return self.change == self.MODIFIED
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
    92
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
    93
    def is_removed(self):
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
    94
        return self.change == self.REMOVED
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
    95
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
    96
    def is_renamed(self):
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
    97
        return self.parentname and self.renamed
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
    98
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
    99
    def is_copied(self):
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   100
        return self.parentname and not self.renamed
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   101
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   102
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   103
class ActiveList(object):
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   104
    '''Complete representation of workspace change.
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   105
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   106
    In practice, a container for ActiveEntrys, and methods to build them,
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   107
    update them, and deal with them en masse.'''
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   108
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   109
    def __init__(self, ws, parenttip, revs=None):
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   110
        self._active = {}
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   111
        self.ws = ws
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   112
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   113
        self.revs = revs
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   114
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   115
        self.base = None
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   116
        self.parenttip = parenttip
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   117
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   118
        #
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   119
        # If we couldn't find a parenttip, the two repositories must
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   120
        # be unrelated (Hg catches most of this, but this case is valid for it
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   121
        # but invalid for us)
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   122
        #
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   123
        if self.parenttip == None:
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   124
            raise util.Abort('repository is unrelated')
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   125
        self.localtip = None
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   126
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   127
        if revs:
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   128
            self.base = revs[0]
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   129
            self.localtip = revs[-1]
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   130
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   131
        self._comments = []
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   132
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   133
        self._build(revs)
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   134
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   135
    def _build(self, revs):
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   136
        if not revs:
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   137
            return
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   138
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   139
        status = self.ws.status(self.parenttip.node(), self.localtip.node())
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   140
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   141
        files = []
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   142
        for ctype in status.values():
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   143
            files.extend(ctype)
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   144
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   145
        #
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   146
        # When a file is renamed, two operations actually occur.
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   147
        # A file copy from source to dest and a removal of source.
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   148
        #
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   149
        # These are represented as two distinct entries in the
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   150
        # changectx and status (one on the dest file for the
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   151
        # copy, one on the source file for the remove).
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   152
        #
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   153
        # Since these are unconnected in both the context and
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   154
        # status we can only make the association by explicitly
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   155
        # looking for it.
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   156
        #
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   157
        # We deal with this thusly:
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   158
        #
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   159
        # We maintain a dict dest -> source of all copies
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   160
        # (updating dest as appropriate, but leaving source alone).
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   161
        #
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   162
        # After all other processing, we mark as renamed any pair
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   163
        # where source is on the removed list.
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   164
        #
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   165
        copies = {}
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   166
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   167
        #
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   168
        # Walk revs looking for renames and adding files that
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   169
        # are in both change context and status to the active
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   170
        # list.
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   171
        #
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   172
        for ctx in revs:
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   173
            desc = ctx.description().splitlines()
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   174
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   175
            self._comments.extend(desc)
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   176
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   177
            for fname in ctx.files():
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   178
                #
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   179
                # We store comments per-entry as well, for the sake of
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   180
                # webrev and similar.  We store twice to avoid the problems
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   181
                # of uniquifying comments for the general list (and possibly
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   182
                # destroying multi-line entities in the process).
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   183
                #
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   184
                if fname not in self:
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   185
                    self._addentry(fname)
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   186
                self[fname].comments.extend(desc)
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   187
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   188
                try:
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   189
                    fctx = ctx.filectx(fname)
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   190
                except revlog.LookupError:
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   191
                    continue
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   192
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   193
                #
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   194
                # NB: .renamed() is a misnomer, this actually checks
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   195
                #     for copies.
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   196
                #
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   197
                rn = fctx.renamed()
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   198
                if rn:
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   199
                    #
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   200
                    # If the source file is a known copy we know its
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   201
                    # ancestry leads us to the parent.
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   202
                    # Otherwise make sure the source file is known to
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   203
                    # be in the parent, we need not care otherwise.
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   204
                    #
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   205
                    # We detect cycles at a later point.  There is no
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   206
                    # reason to continuously handle them.
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   207
                    #
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   208
                    if rn[0] in copies:
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   209
                        copies[fname] = copies[rn[0]]
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   210
                    elif rn[0] in self.parenttip.manifest():
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   211
                        copies[fname] = rn[0]
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   212
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   213
        #
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   214
        # Walk the copy list marking as copied any non-cyclic pair
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   215
        # where the destination file is still present in the local
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   216
        # tip (to avoid ephemeral changes)
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   217
        #
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   218
        # Where source is removed, mark as renamed, and remove the
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   219
        # AL entry for the source file
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   220
        #
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   221
        for fname, oldname in copies.iteritems():
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   222
            if fname == oldname or fname not in self.localtip.manifest():
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   223
                continue
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   224
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   225
            self[fname].parentname = oldname
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   226
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   227
            if oldname in status['removed']:
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   228
                self[fname].renamed = True
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   229
                if oldname in self:
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   230
                    del self[oldname]
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   231
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   232
        #
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   233
        # Walk the active list setting the change type for each active
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   234
        # file.
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   235
        #
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   236
        # In the case of modified files that are not renames or
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   237
        # copies, we do a content comparison, and drop entries that
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   238
        # are not actually modified.
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   239
        #
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   240
        # We walk a copy of the AL such that we can drop entries
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   241
        # within the loop.
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   242
        #
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   243
        for entry in self._active.values():
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   244
            if entry.name not in files:
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   245
                del self[entry.name]
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   246
                continue
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   247
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   248
            if entry.name in status['added']:
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   249
                entry.change = ActiveEntry.ADDED
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   250
            elif entry.name in status['removed']:
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   251
                entry.change = ActiveEntry.REMOVED
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   252
            elif entry.name in status['modified']:
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   253
                entry.change = ActiveEntry.MODIFIED
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   254
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   255
            #
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   256
            # There are cases during a merge where a file will be in
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   257
            # the status return as modified, but in reality be an
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   258
            # addition (ie, not in the parenttip).
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   259
            #
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   260
            # We need to check whether the file is actually present
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   261
            # in the parenttip, and set it as an add, if not.
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   262
            #
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   263
            if entry.name not in self.parenttip.manifest():
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   264
                entry.change = ActiveEntry.ADDED
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   265
            elif entry.is_modified() and not entry.parentname:
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   266
                if not self.filecmp(entry):
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   267
                    del self[entry.name]
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   268
                    continue
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   269
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   270
            assert entry.change
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   271
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   272
    def __contains__(self, fname):
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   273
        return fname in self._active
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   274
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   275
    def __getitem__(self, key):
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   276
        return self._active[key]
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   277
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   278
    def __setitem__(self, key, value):
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   279
        self._active[key] = value
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   280
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   281
    def __delitem__(self, key):
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   282
        del self._active[key]
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   283
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   284
    def __iter__(self):
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   285
        for entry in self._active.values():
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   286
            yield entry
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   287
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   288
    def _addentry(self, fname):
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   289
        if fname not in self:
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   290
            self[fname] = ActiveEntry(fname)
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   291
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   292
    #
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   293
    # Return list of files represented in this AL,
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   294
    # including the parent file of a rename
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   295
    #
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   296
    def files(self):
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   297
        ret = self._active.keys()
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   298
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   299
        ret.extend([x.parentname for x in self
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   300
                    if x.parentname and x.parentname not in ret])
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   301
        return ret
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   302
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   303
    def comments(self):
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   304
        return self._comments
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   305
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   306
    #
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   307
    # It's not uncommon for a child workspace to itself contain the
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   308
    # merge of several other children, with initial branch points in
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   309
    # the parent (possibly from the cset a project gate was created
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   310
    # from, for instance).
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   311
    #
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   312
    # Immediately after recommit, this leaves us looking like this:
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   313
    #
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   314
    #     *   <- recommitted changeset (real tip)
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   315
    #     |
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   316
    #     | *  <- Local tip
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   317
    #     |/|
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   318
    #     * |  <- parent tip
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   319
    #     | |\
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   320
    #     | | |
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   321
    #     | | |\
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   322
    #     | | | |
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   323
    #     | * | |  <- Base
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   324
    #     |/_/__/
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   325
    #
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   326
    #     [left-most is parent, next is child, right two being
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   327
    #     branches in child, intermediate merges parent->child
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   328
    #     omitted]
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   329
    #
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   330
    # Obviously stripping base (the first child-specific delta on the
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   331
    # main child workspace line) doesn't remove the vestigial branches
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   332
    # from other workspaces (or in-workspace branches, or whatever)
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   333
    #
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   334
    # In reality, what we need to strip in a recommit is any
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   335
    # child-specific branch descended from the parent (rather than
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   336
    # another part of the child).  Note that this by its very nature
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   337
    # includes the branch representing the 'main' child workspace.
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   338
    #
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   339
    # We calculate these by walking from base (which is guaranteed to
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   340
    # be the oldest child-local cset) to localtip searching for
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   341
    # changesets with only one parent cset, and where that cset is not
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   342
    # part of the active list (and is therefore outgoing).
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   343
    #
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   344
    def bases(self):
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   345
        '''Find the bases that in combination define the "old"
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   346
        side of a recommitted set of changes, based on AL'''
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   347
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   348
        get = util.cachefunc(lambda r: self.ws.repo.changectx(r).changeset())
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   349
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   350
        # We don't rebuild the AL So the AL local tip is the old tip
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   351
        revrange = "%s:%s" % (self.base.rev(), self.localtip.rev())
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   352
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   353
        changeiter = cmdutil.walkchangerevs(self.ws.repo.ui, self.ws.repo,
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   354
                                            [], get, {'rev': [revrange]})[0]
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   355
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   356
        hold = []
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   357
        ret = []
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   358
        alrevs = [x.rev() for x in self.revs]
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   359
        for st, rev, fns in changeiter:
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   360
            n = self.ws.repo.changelog.node(rev)
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   361
            if st == 'add':
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   362
                if rev in alrevs:
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   363
                    hold.append(n)
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   364
            elif st == 'iter':
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   365
                if n not in hold:
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   366
                    continue
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   367
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   368
                p = self.ws.repo.changelog.parents(n)
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   369
                if p[1] != node.nullid:
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   370
                    continue
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   371
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   372
                if self.ws.repo.changectx(p[0]).rev() not in alrevs:
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   373
                    ret.append(n)
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   374
        return ret
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   375
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   376
    def tags(self):
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   377
        '''Find tags that refer to a changeset in the ActiveList,
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   378
           returning a list of 3-tuples (tag, node, is_local) for each.
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   379
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   380
           We return all instances of a tag that refer to such a node,
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   381
           not just that which takes precedence.'''
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   382
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   383
        if os.path.exists(self.ws.repo.join('localtags')):
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   384
            l = self.ws.repo.opener('localtags').readlines()
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   385
            ltags = [x.rstrip().split(' ') for x in l]
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   386
        else:
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   387
            ltags = []
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   388
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   389
        # We want to use the tags file from the localtip
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   390
        if '.hgtags' in self.localtip.manifest():
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   391
            f = self.localtip.filectx('.hgtags')
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   392
            rtags = [x.rstrip().split(' ') for x in f.data().splitlines()]
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   393
        else:
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   394
            rtags = []
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   395
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   396
        nodes = [node.hex(n.node()) for n in self.revs]
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   397
        tags = []
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   398
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   399
        for nd, name in rtags:
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   400
            if nd in nodes:
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   401
                tags.append((name, self.ws.repo.lookup(nd), False))
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   402
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   403
        for nd, name in ltags:
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   404
            if nd in nodes:
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   405
                tags.append((name, self.ws.repo.lookup(nd), True))
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   406
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   407
        return tags
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   408
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   409
    def filecmp(self, entry):
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   410
        '''Compare two revisions of two files
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   411
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   412
        Return True if file changed, False otherwise.
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   413
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   414
        The fast path compares file metadata, slow path is a
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   415
        real comparison of file content.'''
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   416
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   417
        parentfile = self.parenttip.filectx(entry.parentname or entry.name)
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   418
        localfile = self.localtip.filectx(entry.name)
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   419
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   420
        #
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   421
        # NB: Keep these ordered such as to make every attempt
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   422
        #     to short-circuit the more time consuming checks.
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   423
        #
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   424
        if parentfile.size() != localfile.size():
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   425
            return True
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   426
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   427
        if parentfile.fileflags() != localfile.fileflags():
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   428
            return True
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   429
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   430
        if parentfile.cmp(localfile.data()):
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   431
            return True
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   432
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   433
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   434
class WorkSpace(object):
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   435
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   436
    def __init__(self, repository):
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   437
        self.repo = repository
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   438
        self.ui = self.repo.ui
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   439
        self.name = self.repo.root
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   440
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   441
        parent = self.repo.ui.expandpath('default')
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   442
        if parent == 'default':
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   443
            parent = None
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   444
        self.parentrepo = parent
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   445
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   446
        self.activecache = {}
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   447
        self.outgoingcache = {}
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   448
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   449
    def parent(self, spec=None):
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   450
        '''Return canonical workspace parent, either SPEC if passed,
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   451
        or default parent otherwise'''
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   452
        return spec or self.parentrepo
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   453
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   454
    def _localtip(self, bases, heads):
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   455
        '''Return a tuple (changectx, workingctx) representing the most
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   456
        representative head to act as the local tip.
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   457
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   458
        If the working directory is modified, the changectx is its
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   459
        tipmost local parent (or tipmost parent, if neither is
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   460
        local), and the workingctx is non-null.
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   461
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   462
        If the working directory is clean, the workingctx is null.
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   463
        The changectx is the tip-most local head on the current branch.
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   464
        If this can't be determined for some reason (e.g., the parent
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   465
        repo is inacessible), changectx is the tip-most head on the
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   466
        current branch.
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   467
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   468
        If the workingctx is non-null it is the actual local tip (and would
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   469
        be the local tip in any generated ActiveList, for instance),
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   470
        the better parent revision is returned also to aid callers needing
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   471
        a real changeset to act as a surrogate for an uncommitted change.'''
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   472
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   473
        def tipmost_of(nodes):
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   474
            return sorted(nodes, cmp=lambda x, y: cmp(x.rev(), y.rev()))[-1]
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   475
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   476
        #
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   477
        # We need a full set of outgoing nodes such that we can limit
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   478
        # local branch heads to those which are outgoing
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   479
        #
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   480
        outnodes = self.repo.changelog.nodesbetween(bases, heads)[0]
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   481
        wctx = self.repo.workingctx()
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   482
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   483
        #
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   484
        # A modified working context is seen as a proto-branch, where
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   485
        # the 'heads' from our view are the parent revisions of that
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   486
        # context.
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   487
        # (and the working head is it)
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   488
        #
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   489
        if (wctx.files() or len(wctx.parents()) > 1 or
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   490
            wctx.branch() != wctx.parents()[0].branch()):
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   491
            heads = wctx.parents()
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   492
        else:
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   493
            heads = [self.repo.changectx(n) for n in heads]
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   494
            wctx = None
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   495
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   496
        localchoices = [n for n in heads if n.node() in outnodes]
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   497
        return (tipmost_of(localchoices or heads), wctx)
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   498
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   499
    def _parenttip(self, localtip, parent=None):
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   500
        '''Find the closest approximation of the parents tip, as best
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   501
        as we can.
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   502
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   503
        In parent-less workspaces returns our tip (given the best
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   504
        we can do is deal with uncommitted changes)'''
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   505
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   506
        def tipmost_shared(head, outnodes):
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   507
            '''Return the tipmost node on the same branch as head that is not
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   508
            in outnodes.
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   509
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   510
            We walk from head to the bottom of the workspace (revision
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   511
            0) collecting nodes not in outnodes during the add phase
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   512
            and return the first node we see in the iter phase that
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   513
            was previously collected.
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   514
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   515
            See the docstring of mercurial.cmdutil.walkchangerevs()
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   516
            for the phased approach to the iterator returned.  The
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   517
            important part to note is that the 'add' phase gathers
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   518
            nodes, which the 'iter' phase then iterates through.'''
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   519
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   520
            get = util.cachefunc(lambda r: self.repo.changectx(r).changeset())
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   521
            changeiter = cmdutil.walkchangerevs(self.repo.ui, self.repo, [],
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   522
                                                get, {'rev': ['%s:0' % head],
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   523
                                                      'follow': True})[0]
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   524
            seen = []
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   525
            for st, rev, fns in changeiter:
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   526
                n = self.repo.changelog.node(rev)
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   527
                if st == 'add':
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   528
                    if n not in outnodes:
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   529
                        seen.append(n)
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   530
                elif st == 'iter':
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   531
                    if n in seen:
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   532
                        return rev
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   533
            return None
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   534
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   535
        tipctx, wctx = localtip
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   536
        parent = self.parent(parent)
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   537
        outgoing = None
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   538
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   539
        if parent:
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   540
            outgoing = self.findoutgoing(parent)
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   541
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   542
        if wctx:
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   543
            possible_branches = wctx.parents()
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   544
        else:
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   545
            possible_branches = [tipctx]
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   546
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   547
        nodes = self.repo.changelog.nodesbetween(outgoing)[0]
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   548
        ptips = map(lambda x: tipmost_shared(x.rev(), nodes), possible_branches)
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   549
        return self.repo.changectx(sorted(ptips)[-1])
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   550
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   551
    def status(self, base=None, head=None):
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   552
        '''Translate from the hg 6-tuple status format to a hash keyed
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   553
        on change-type'''
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   554
        states = ['modified', 'added', 'removed', 'deleted', 'unknown',
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   555
              'ignored']
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   556
        chngs = self.repo.status(base, head)
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   557
        return dict(zip(states, chngs))
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   558
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   559
    #
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   560
    # Cache findoutgoing results
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   561
    #
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   562
    def findoutgoing(self, parent):
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   563
        ret = []
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   564
        if parent in self.outgoingcache:
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   565
            ret = self.outgoingcache[parent]
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   566
        else:
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   567
            self.ui.pushbuffer()
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   568
            try:
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   569
                pws = hg.repository(self.ui, parent)
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   570
                ret = self.repo.findoutgoing(pws)
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   571
            except repo.RepoError:
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   572
                self.ui.warn(
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   573
                    "Warning: Parent workspace %s is not accessible\n" % parent)
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   574
                self.ui.warn("active list will be incomplete\n\n")
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   575
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   576
            self.outgoingcache[parent] = ret
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   577
            self.ui.popbuffer()
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   578
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   579
        return ret
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   580
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   581
    def modified(self):
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   582
        '''Return a list of files modified in the workspace'''
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   583
        wctx = self.repo.workingctx()
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   584
        return sorted(wctx.files() + wctx.deleted()) or None
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   585
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   586
    def merged(self):
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   587
        '''Return boolean indicating whether the workspace has an uncommitted
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   588
        merge'''
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   589
        wctx = self.repo.workingctx()
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   590
        return len(wctx.parents()) > 1
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   591
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   592
    def branched(self):
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   593
        '''Return boolean indicating whether the workspace has an
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   594
        uncommitted named branch'''
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   595
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   596
        wctx = self.repo.workingctx()
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   597
        return wctx.branch() != wctx.parents()[0].branch()
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   598
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   599
    def active(self, parent=None):
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   600
        '''Return an ActiveList describing changes between workspace
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   601
        and parent workspace (including uncommitted changes).
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   602
        If workspace has no parent ActiveList will still describe any
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   603
        uncommitted changes'''
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   604
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   605
        parent = self.parent(parent)
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   606
        if parent in self.activecache:
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   607
            return self.activecache[parent]
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   608
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   609
        if parent:
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   610
            outgoing = self.findoutgoing(parent)
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   611
        else:
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   612
            outgoing = []       # No parent, no outgoing nodes
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   613
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   614
        branchheads = self.repo.heads(start=self.repo.dirstate.parents()[0])
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   615
        ourhead, workinghead = self._localtip(outgoing, branchheads)
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   616
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   617
        if len(branchheads) > 1:
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   618
            self.ui.warn('The current branch has more than one head, '
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   619
                         'using %s\n' % ourhead.rev())
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   620
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   621
        if workinghead:
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   622
            parents = workinghead.parents()
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   623
            ctxs = [self.repo.changectx(n) for n in
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   624
                    self.repo.changelog.nodesbetween(outgoing,
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   625
                                                     [h.node() for h in
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   626
                                                      parents])[0]]
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   627
            ctxs.append(workinghead)
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   628
        else:
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   629
            ctxs = [self.repo.changectx(n) for n in
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   630
                    self.repo.changelog.nodesbetween(outgoing,
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   631
                                                     [ourhead.node()])[0]]
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   632
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   633
        act = ActiveList(self, self._parenttip((ourhead, workinghead), parent),
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   634
                         ctxs)
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   635
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   636
        self.activecache[parent] = act
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   637
        return act
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   638
7298
b69e27387f74 6733918 Teamware has retired, please welcome your new manager, Mercurial
Mark J. Nelson <Mark.J.Nelson@Sun.COM>
parents: 7078
diff changeset
   639
    def pdiff(self, pats, opts, parent=None):
7078
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   640
        'Return diffs relative to PARENT, as best as we can make out'
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   641
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   642
        parent = self.parent(parent)
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   643
        act = self.active(parent)
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   644
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   645
        #
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   646
        # act.localtip maybe nil, in the case of uncommitted local
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   647
        # changes.
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   648
        #
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   649
        if not act.revs:
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   650
            return
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   651
7298
b69e27387f74 6733918 Teamware has retired, please welcome your new manager, Mercurial
Mark J. Nelson <Mark.J.Nelson@Sun.COM>
parents: 7078
diff changeset
   652
        names, match = cmdutil.matchpats(self.repo, pats, opts)[:2]
b69e27387f74 6733918 Teamware has retired, please welcome your new manager, Mercurial
Mark J. Nelson <Mark.J.Nelson@Sun.COM>
parents: 7078
diff changeset
   653
        opts = patch.diffopts(self.ui, opts)
b69e27387f74 6733918 Teamware has retired, please welcome your new manager, Mercurial
Mark J. Nelson <Mark.J.Nelson@Sun.COM>
parents: 7078
diff changeset
   654
7078
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   655
        ret = cStringIO.StringIO()
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   656
        patch.diff(self.repo, act.parenttip.node(), act.localtip.node(),
7298
b69e27387f74 6733918 Teamware has retired, please welcome your new manager, Mercurial
Mark J. Nelson <Mark.J.Nelson@Sun.COM>
parents: 7078
diff changeset
   657
                   names, fp=ret, opts=opts, match=match)
7078
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   658
        return ret.getvalue()
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   659
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   660
    #
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   661
    # Theory:
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   662
    #
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   663
    # We wish to go from a single series of consecutive changesets
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   664
    # (possibly including merges with the parent) to a single
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   665
    # changeset faithfully representing contents and copy history.
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   666
    #
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   667
    # We achieve this in a somewhat confusing fashion.
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   668
    #
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   669
    # - Sanity check the workspace
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   670
    # - Update the workspace to tip
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   671
    # - Enter into the dirstate the sum total of file contents in the
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   672
    #   to-be-squished changesets
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   673
    # - Commit this in-progress change (which has no changes at all,
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   674
    #   in reality) On top of the effective parent tip.
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   675
    # - Strip the child-local branch(es) (see ActiveList.bases())
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   676
    #
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   677
    def squishdeltas(self, active, message, user=None):
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   678
        '''Create a single conglomerate changeset, with log message MESSAGE
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   679
        containing the changes from ACTIVE.  USER, if set, is used
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   680
        as the author name.
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   681
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   682
        The old changes are removed.'''
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   683
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   684
        def strip_tags(nodes):
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   685
            '''Remove any tags referring to the specified nodes.'''
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   686
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   687
            if os.path.exists(self.repo.join('localtags')):
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   688
                fh = self.repo.opener('localtags').readlines()
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   689
                tags = [t for t in fh if t.split(' ')[0] not in nodes]
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   690
                fh = self.repo.opener('localtags', 'w', atomictemp=True)
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   691
                fh.writelines(tags)
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   692
                fh.rename()
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   693
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   694
            if os.path.exists(self.repo.wjoin('.hgtags')):
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   695
                fh = self.repo.wopener('.hgtags', 'rb').readlines()
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   696
                tags = [t for t in fh if t.split(' ')[0] not in nodes]
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   697
                fh = self.repo.wopener('.hgtags', 'wb', atomictemp=True)
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   698
                fh.writelines(tags)
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   699
                fh.rename()
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   700
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   701
        wlock = self.repo.wlock()
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   702
        lock = self.repo.lock()
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   703
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   704
        #
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   705
        # The files involved need to be present in the workspace and
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   706
        # not otherwise molested, rather than the workspace not being
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   707
        # modified we also need to prevent files being deleted (but
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   708
        # left versioned) too.
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   709
        #
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   710
        # The easiest way to achieve this is to update the working
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   711
        # copy to tip.
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   712
        #
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   713
        self.clean()
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   714
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   715
        try:
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   716
            strip_tags([node.hex(ctx.node()) for ctx in active.revs])
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   717
        except EnvironmentError, e:
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   718
            raise util.Abort('Could not recommit tags: %s\n' % e)
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   719
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   720
        #
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   721
        # For copied files, we need to enter the copy into the
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   722
        # dirstate before we force the commit such that the
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   723
        # file logs of both branches (old and new) contain
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   724
        # representation of the copy.
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   725
        #
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   726
        parentman = active.parenttip.manifest()
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   727
        for entry in active:
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   728
            if not entry.is_renamed() and not entry.is_copied():
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   729
                continue
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   730
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   731
            assert entry.parentname in parentman, \
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   732
                ("parentname '%s' (of '%s') not in parent" %
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   733
                 (entry.parentname, entry.name))
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   734
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   735
            #
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   736
            # If the source file exists, and used to be versioned
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   737
            # this will cause this to become a true copy
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   738
            # (re-introducing the source file)
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   739
            #
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   740
            # We bandaid this, by removing the source file in this
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   741
            # case.  If we're here, the user has already agreed to this
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   742
            # from above.
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   743
            #
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   744
            if (entry.is_renamed() and
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   745
                os.path.exists(self.repo.wjoin(entry.parentname))):
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   746
                os.unlink(self.repo.wjoin(entry.parentname))
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   747
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   748
            self.repo.copy(entry.parentname, entry.name)
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   749
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   750
        if active.files():
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   751
            extra = {'branch': active.localtip.branch()}
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   752
            self.repo.commit(files=active.files(), text=message,
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   753
                             user=user, p1=active.parenttip.node(), p2=None,
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   754
                             extra=extra)
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   755
            wsstate = "recommitted changeset"
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   756
            self.clean()
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   757
        else:
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   758
            #
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   759
            # If all we're doing is stripping the old nodes, we want to
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   760
            # update the working copy such that we're not at a revision
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   761
            # that's about to go away.
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   762
            #
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   763
            wsstate = "tip changeset"
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   764
            self.clean(rev=active.parenttip.node())
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   765
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   766
        # Silence all the strip and update fun
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   767
        self.ui.pushbuffer()
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   768
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   769
        #
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   770
        # We must strip away the old representation of the child
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   771
        # branch(es).  This may involve stripping a theoretically
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   772
        # large number of branches in certain cases
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   773
        #
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   774
        bases = active.bases()
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   775
        try:
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   776
            try:
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   777
                for basenode in bases:
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   778
                    repair.strip(self.ui, self.repo, basenode, backup=False)
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   779
            except:
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   780
                #
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   781
                # If this fails, it may leave us in a surprising place in
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   782
                # the history.
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   783
                #
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   784
                # We want to warn the user that something went wrong,
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   785
                # and what will happen next, re-raise the exception, and
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   786
                # bring the working copy back into a consistent state
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   787
                # (which the finally block will do)
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   788
                #
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   789
                self.ui.warn("stripping failed, your workspace will have "
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   790
                             "superfluous heads.\n"
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   791
                             "your workspace has been updated to the "
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   792
                             "%s.\n" % wsstate)
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   793
                raise               # Re-raise the exception
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   794
        finally:
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   795
            #
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   796
            # We need to remove Hg's undo information (used for rollback),
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   797
            # since it refers to data that will probably not exist after
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   798
            # the strip.
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   799
            #
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   800
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   801
            self.clean()
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   802
            self.repo.dirstate.write() # Flush the dirstate
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   803
            self.repo.invalidate()     # Invalidate caches
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   804
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   805
            if os.path.exists(self.repo.sjoin('undo')):
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   806
                try:
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   807
                    os.unlink(self.repo.sjoin('undo'))
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   808
                except EnvironmentError, e:
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   809
                    raise util.Abort('failed to remove undo data: %s\n' % e)
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   810
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   811
            self.ui.popbuffer()
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   812
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   813
    def filepath(self, path):
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   814
        'Return the full path to a workspace file.'
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   815
        return self.repo.pathto(path)
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   816
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   817
    def clean(self, rev=None):
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   818
        '''Bring workspace up to REV (or tip) forcefully (discarding in
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   819
        progress changes)'''
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   820
        if rev != None:
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   821
            rev = self.repo.lookup(rev)
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   822
        else:
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   823
            rev = self.repo.changelog.tip()
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   824
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   825
        wlock = self.repo.wlock()
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   826
        hg.clean(self.repo, rev, show_stats=False)
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   827
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   828
    def mq_applied(self):
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   829
        '''True if the workspace has Mq patches applied'''
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   830
        q = mq.queue(self.ui, self.repo.join(''))
935563142864 6538468 add Mercurial support to ON developer tools
mjnelson
parents:
diff changeset
   831
        return q.applied