mercurial/wdutil.py
author Matt Mackall <mpm@selenic.com>
Sun, 08 May 2011 11:39:24 -0500
changeset 14267 6332c02b3d68
parent 14259 df9ccd39828c
permissions -rw-r--r--
check-code: complain about set.isdisjoint
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
14259
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
     1
# wdutil.py - working dir utilities
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
     2
#
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
     3
# Copyright 2011 Patrick Mezard <pmezard@gmail.com>
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
     4
#
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
     5
# This software may be used and distributed according to the terms of the
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
     6
# GNU General Public License version 2 or any later version.
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
     7
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
     8
import glob, os
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
     9
import util, similar, scmutil
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    10
import match as matchmod
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    11
from i18n import _
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    12
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    13
def expandpats(pats):
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    14
    if not util.expandglobs:
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    15
        return list(pats)
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    16
    ret = []
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    17
    for p in pats:
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    18
        kind, name = matchmod._patsplit(p, None)
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    19
        if kind is None:
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    20
            try:
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    21
                globbed = glob.glob(name)
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    22
            except re.error:
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    23
                globbed = [name]
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    24
            if globbed:
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    25
                ret.extend(globbed)
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    26
                continue
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    27
        ret.append(p)
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    28
    return ret
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    29
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    30
def match(repo, pats=[], opts={}, globbed=False, default='relpath'):
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    31
    if pats == ("",):
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    32
        pats = []
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    33
    if not globbed and default == 'relpath':
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    34
        pats = expandpats(pats or [])
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    35
    m = matchmod.match(repo.root, repo.getcwd(), pats,
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    36
                       opts.get('include'), opts.get('exclude'), default,
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    37
                       auditor=repo.auditor)
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    38
    def badfn(f, msg):
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    39
        repo.ui.warn("%s: %s\n" % (m.rel(f), msg))
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    40
    m.bad = badfn
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    41
    return m
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    42
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    43
def matchall(repo):
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    44
    return matchmod.always(repo.root, repo.getcwd())
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    45
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    46
def matchfiles(repo, files):
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    47
    return matchmod.exact(repo.root, repo.getcwd(), files)
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    48
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    49
def addremove(repo, pats=[], opts={}, dry_run=None, similarity=None):
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    50
    if dry_run is None:
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    51
        dry_run = opts.get('dry_run')
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    52
    if similarity is None:
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    53
        similarity = float(opts.get('similarity') or 0)
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    54
    # we'd use status here, except handling of symlinks and ignore is tricky
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    55
    added, unknown, deleted, removed = [], [], [], []
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    56
    audit_path = scmutil.pathauditor(repo.root)
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    57
    m = match(repo, pats, opts)
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    58
    for abs in repo.walk(m):
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    59
        target = repo.wjoin(abs)
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    60
        good = True
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    61
        try:
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    62
            audit_path(abs)
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    63
        except (OSError, util.Abort):
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    64
            good = False
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    65
        rel = m.rel(abs)
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    66
        exact = m.exact(abs)
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    67
        if good and abs not in repo.dirstate:
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    68
            unknown.append(abs)
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    69
            if repo.ui.verbose or not exact:
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    70
                repo.ui.status(_('adding %s\n') % ((pats and rel) or abs))
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    71
        elif repo.dirstate[abs] != 'r' and (not good or not os.path.lexists(target)
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    72
            or (os.path.isdir(target) and not os.path.islink(target))):
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    73
            deleted.append(abs)
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    74
            if repo.ui.verbose or not exact:
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    75
                repo.ui.status(_('removing %s\n') % ((pats and rel) or abs))
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    76
        # for finding renames
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    77
        elif repo.dirstate[abs] == 'r':
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    78
            removed.append(abs)
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    79
        elif repo.dirstate[abs] == 'a':
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    80
            added.append(abs)
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    81
    copies = {}
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    82
    if similarity > 0:
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    83
        for old, new, score in similar.findrenames(repo,
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    84
                added + unknown, removed + deleted, similarity):
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    85
            if repo.ui.verbose or not m.exact(old) or not m.exact(new):
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    86
                repo.ui.status(_('recording removal of %s as rename to %s '
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    87
                                 '(%d%% similar)\n') %
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    88
                               (m.rel(old), m.rel(new), score * 100))
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    89
            copies[new] = old
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    90
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    91
    if not dry_run:
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    92
        wctx = repo[None]
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    93
        wlock = repo.wlock()
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    94
        try:
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    95
            wctx.remove(deleted)
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    96
            wctx.add(unknown)
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    97
            for new, old in copies.iteritems():
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    98
                wctx.copy(old, new)
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    99
        finally:
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
   100
            wlock.release()
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
   101
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
   102
def updatedir(ui, repo, patches, similarity=0):
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
   103
    '''Update dirstate after patch application according to metadata'''
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
   104
    if not patches:
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
   105
        return []
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
   106
    copies = []
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
   107
    removes = set()
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
   108
    cfiles = patches.keys()
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
   109
    cwd = repo.getcwd()
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
   110
    if cwd:
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
   111
        cfiles = [util.pathto(repo.root, cwd, f) for f in patches.keys()]
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
   112
    for f in patches:
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
   113
        gp = patches[f]
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
   114
        if not gp:
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
   115
            continue
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
   116
        if gp.op == 'RENAME':
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
   117
            copies.append((gp.oldpath, gp.path))
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
   118
            removes.add(gp.oldpath)
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
   119
        elif gp.op == 'COPY':
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
   120
            copies.append((gp.oldpath, gp.path))
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
   121
        elif gp.op == 'DELETE':
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
   122
            removes.add(gp.path)
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
   123
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
   124
    wctx = repo[None]
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
   125
    for src, dst in copies:
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
   126
        dirstatecopy(ui, repo, wctx, src, dst, cwd=cwd)
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
   127
    if (not similarity) and removes:
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
   128
        wctx.remove(sorted(removes), True)
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
   129
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
   130
    for f in patches:
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
   131
        gp = patches[f]
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
   132
        if gp and gp.mode:
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
   133
            islink, isexec = gp.mode
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
   134
            dst = repo.wjoin(gp.path)
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
   135
            # patch won't create empty files
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
   136
            if gp.op == 'ADD' and not os.path.lexists(dst):
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
   137
                flags = (isexec and 'x' or '') + (islink and 'l' or '')
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
   138
                repo.wwrite(gp.path, '', flags)
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
   139
            util.setflags(dst, islink, isexec)
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
   140
    addremove(repo, cfiles, similarity=similarity)
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
   141
    files = patches.keys()
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
   142
    files.extend([r for r in removes if r not in files])
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
   143
    return sorted(files)
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
   144
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
   145
def dirstatecopy(ui, repo, wctx, src, dst, dryrun=False, cwd=None):
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
   146
    """Update the dirstate to reflect the intent of copying src to dst. For
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
   147
    different reasons it might not end with dst being marked as copied from src.
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
   148
    """
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
   149
    origsrc = repo.dirstate.copied(src) or src
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
   150
    if dst == origsrc: # copying back a copy?
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
   151
        if repo.dirstate[dst] not in 'mn' and not dryrun:
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
   152
            repo.dirstate.normallookup(dst)
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
   153
    else:
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
   154
        if repo.dirstate[origsrc] == 'a' and origsrc == src:
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
   155
            if not ui.quiet:
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
   156
                ui.warn(_("%s has not been committed yet, so no copy "
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
   157
                          "data will be stored for %s.\n")
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
   158
                        % (repo.pathto(origsrc, cwd), repo.pathto(dst, cwd)))
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
   159
            if repo.dirstate[dst] in '?r' and not dryrun:
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
   160
                wctx.add([dst])
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
   161
        elif not dryrun:
df9ccd39828c patch: move updatedir() from cmdutil into patch
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
   162
            wctx.copy(origsrc, dst)