mercurial/commands.py
author mpm@selenic.com
Wed, 08 Jun 2005 10:16:33 -0800
changeset 276 10e325db7347
parent 275 61d45b0ba8fb
child 281 574420507d8c
permissions -rw-r--r--
add tracking of execute permissions -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 add tracking of execute permissions Changes to executable permissions are now tracked. We only track one bit here as the others tends to be problematic. "hg manifest" now shows file permissions. manifest hash: b76b85d12a9550fdc9fbc4f9446a812f3a2bbe88 -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.0 (GNU/Linux) iD8DBQFCpzYBywK+sNU5EO8RAgkMAJ48l2ac12E20EFS24/i8ScwOtG4HwCgkbaE ue6l1RJroqzNA7vNeqwCwK4= =sEmJ -----END PGP SIGNATURE-----
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
249
619e775aa7f9 import and startup cleanups
mpm@selenic.com
parents: 248
diff changeset
     1
# commands.py - command processing for mercurial
619e775aa7f9 import and startup cleanups
mpm@selenic.com
parents: 248
diff changeset
     2
#
619e775aa7f9 import and startup cleanups
mpm@selenic.com
parents: 248
diff changeset
     3
# Copyright 2005 Matt Mackall <mpm@selenic.com>
619e775aa7f9 import and startup cleanups
mpm@selenic.com
parents: 248
diff changeset
     4
#
619e775aa7f9 import and startup cleanups
mpm@selenic.com
parents: 248
diff changeset
     5
# This software may be used and distributed according to the terms
619e775aa7f9 import and startup cleanups
mpm@selenic.com
parents: 248
diff changeset
     6
# of the GNU General Public License, incorporated herein by reference.
619e775aa7f9 import and startup cleanups
mpm@selenic.com
parents: 248
diff changeset
     7
262
3db700146536 implement demand loading hack
mpm@selenic.com
parents: 259
diff changeset
     8
import os, re, sys, signal
3db700146536 implement demand loading hack
mpm@selenic.com
parents: 259
diff changeset
     9
import fancyopts, ui, hg
3db700146536 implement demand loading hack
mpm@selenic.com
parents: 259
diff changeset
    10
from demandload import *
3db700146536 implement demand loading hack
mpm@selenic.com
parents: 259
diff changeset
    11
demandload(globals(), "mdiff time hgweb traceback")
209
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
    12
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
    13
class UnknownCommand(Exception): pass
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
    14
245
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
    15
def filterfiles(filters, files):
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
    16
    l = [ x for x in files if x in filters ]
213
d2172916ef6c commands: migrate status and branch
mpm@selenic.com
parents: 212
diff changeset
    17
245
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
    18
    for t in filters:
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
    19
        if t and t[-1] != os.sep: t += os.sep
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
    20
        l += [ x for x in files if x.startswith(t) ]
213
d2172916ef6c commands: migrate status and branch
mpm@selenic.com
parents: 212
diff changeset
    21
    return l
d2172916ef6c commands: migrate status and branch
mpm@selenic.com
parents: 212
diff changeset
    22
245
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
    23
def relfilter(repo, files):
213
d2172916ef6c commands: migrate status and branch
mpm@selenic.com
parents: 212
diff changeset
    24
    if os.getcwd() != repo.root:
d2172916ef6c commands: migrate status and branch
mpm@selenic.com
parents: 212
diff changeset
    25
        p = os.getcwd()[len(repo.root) + 1: ]
245
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
    26
        return filterfiles(p, files)
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
    27
    return files
213
d2172916ef6c commands: migrate status and branch
mpm@selenic.com
parents: 212
diff changeset
    28
209
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
    29
def relpath(repo, args):
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
    30
    if os.getcwd() != repo.root:
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
    31
        p = os.getcwd()[len(repo.root) + 1: ]
245
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
    32
        return [ os.path.normpath(os.path.join(p, x)) for x in args ]
209
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
    33
    return args
245
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
    34
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
    35
def dodiff(repo, files = None, node1 = None, node2 = None):
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
    36
    def date(c):
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
    37
        return time.asctime(time.gmtime(float(c[2].split(' ')[0])))
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
    38
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
    39
    if node2:
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
    40
        change = repo.changelog.read(node2)
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
    41
        mmap2 = repo.manifest.read(change[0])
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
    42
        (c, a, d) = repo.diffrevs(node1, node2)
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
    43
        def read(f): return repo.file(f).read(mmap2[f])
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
    44
        date2 = date(change)
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
    45
    else:
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
    46
        date2 = time.asctime()
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
    47
        (c, a, d, u) = repo.diffdir(repo.root, node1)
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
    48
        if not node1:
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
    49
            node1 = repo.dirstate.parents()[0]
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
    50
        def read(f): return file(os.path.join(repo.root, f)).read()
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
    51
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
    52
    change = repo.changelog.read(node1)
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
    53
    mmap = repo.manifest.read(change[0])
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
    54
    date1 = date(change)
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
    55
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
    56
    if files:
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
    57
        c, a, d = map(lambda x: filterfiles(files, x), (c, a, d))
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
    58
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
    59
    for f in c:
275
61d45b0ba8fb various merge improvements
mpm@selenic.com
parents: 270
diff changeset
    60
        to = None
61d45b0ba8fb various merge improvements
mpm@selenic.com
parents: 270
diff changeset
    61
        if f in mmap:
61d45b0ba8fb various merge improvements
mpm@selenic.com
parents: 270
diff changeset
    62
            to = repo.file(f).read(mmap[f])
245
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
    63
        tn = read(f)
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
    64
        sys.stdout.write(mdiff.unidiff(to, date1, tn, date2, f))
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
    65
    for f in a:
264
4c1d7072d5cd Attempt to make diff deal with null sources properly
mpm@selenic.com
parents: 262
diff changeset
    66
        to = None
245
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
    67
        tn = read(f)
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
    68
        sys.stdout.write(mdiff.unidiff(to, date1, tn, date2, f))
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
    69
    for f in d:
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
    70
        to = repo.file(f).read(mmap[f])
264
4c1d7072d5cd Attempt to make diff deal with null sources properly
mpm@selenic.com
parents: 262
diff changeset
    71
        tn = None
245
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
    72
        sys.stdout.write(mdiff.unidiff(to, date1, tn, date2, f))
209
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
    73
    
212
48398a5353e3 commands: better argument processing, per-command help
mpm@selenic.com
parents: 211
diff changeset
    74
def help(ui, cmd=None):
255
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
    75
    '''show help for a given command or all commands'''
212
48398a5353e3 commands: better argument processing, per-command help
mpm@selenic.com
parents: 211
diff changeset
    76
    if cmd:
48398a5353e3 commands: better argument processing, per-command help
mpm@selenic.com
parents: 211
diff changeset
    77
        try:
48398a5353e3 commands: better argument processing, per-command help
mpm@selenic.com
parents: 211
diff changeset
    78
            i = find(cmd)
48398a5353e3 commands: better argument processing, per-command help
mpm@selenic.com
parents: 211
diff changeset
    79
            ui.write("%s\n\n" % i[2])
48398a5353e3 commands: better argument processing, per-command help
mpm@selenic.com
parents: 211
diff changeset
    80
            ui.write(i[0].__doc__, "\n")
48398a5353e3 commands: better argument processing, per-command help
mpm@selenic.com
parents: 211
diff changeset
    81
        except UnknownCommand:
268
1634a7ea6748 unknown command fixups
mpm@selenic.com
parents: 266
diff changeset
    82
            ui.warn("hg: unknown command %s\n" % cmd)
212
48398a5353e3 commands: better argument processing, per-command help
mpm@selenic.com
parents: 211
diff changeset
    83
        sys.exit(0)
255
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
    84
    else:
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
    85
        ui.status('hg commands:\n\n')
209
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
    86
255
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
    87
        h = {}
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
    88
        for e in table.values():
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
    89
            f = e[0]
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
    90
            if f.__name__.startswith("debug"): continue
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
    91
            d = ""
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
    92
            if f.__doc__:
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
    93
                d = f.__doc__.splitlines(0)[0].rstrip()
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
    94
            h[f.__name__] = d
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
    95
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
    96
        fns = h.keys()
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
    97
        fns.sort()
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
    98
        m = max(map(len, fns))
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
    99
        for f in fns:
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
   100
            ui.status(' %-*s   %s\n' % (m, f, h[f]))
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
   101
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
   102
# Commands start here, listed alphabetically
209
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
   103
245
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
   104
def add(ui, repo, file, *files):
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
   105
    '''add the specified files on the next commit'''
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
   106
    repo.add(relpath(repo, (file,) + files))
213
d2172916ef6c commands: migrate status and branch
mpm@selenic.com
parents: 212
diff changeset
   107
245
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
   108
def addremove(ui, repo):
255
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
   109
    """add all new files, delete all missing files"""
230
00ea3613f82c make diffdir default to dirstate.parents()
mpm@selenic.com
parents: 227
diff changeset
   110
    (c, a, d, u) = repo.diffdir(repo.root)
259
45c293b71341 fix addremove
mpm@selenic.com
parents: 257
diff changeset
   111
    repo.add(u)
245
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
   112
    repo.remove(d)
219
8ff4532376a4 hg checkout: refuse to checkout if there are outstanding changes
mpm@selenic.com
parents: 214
diff changeset
   113
245
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
   114
def annotate(u, repo, file, *files, **ops):
255
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
   115
    """show changeset information per file line"""
209
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
   116
    def getnode(rev):
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
   117
        return hg.short(repo.changelog.node(rev))
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
   118
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
   119
    def getname(rev):
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
   120
        try:
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
   121
            return bcache[rev]
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
   122
        except KeyError:
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
   123
            cl = repo.changelog.read(repo.changelog.node(rev))
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
   124
            name = cl[1]
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
   125
            f = name.find('@')
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
   126
            if f >= 0:
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
   127
                name = name[:f]
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
   128
            bcache[rev] = name
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
   129
            return name
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
   130
    
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
   131
    bcache = {}
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
   132
    opmap = [['user', getname], ['number', str], ['changeset', getnode]]
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
   133
    if not ops['user'] and not ops['changeset']:
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
   134
        ops['number'] = 1
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
   135
227
f57519cddd3d move repo.current to dirstate.parents()
mpm@selenic.com
parents: 221
diff changeset
   136
    node = repo.dirstate.parents()[0]
209
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
   137
    if ops['revision']:
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
   138
        node = repo.changelog.lookup(ops['revision'])
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
   139
    change = repo.changelog.read(node)
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
   140
    mmap = repo.manifest.read(change[0])
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
   141
    maxuserlen = 0
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
   142
    maxchangelen = 0
245
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
   143
    for f in relpath(repo, (file,) + files):
209
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
   144
        lines = repo.file(f).annotate(mmap[f])
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
   145
        pieces = []
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
   146
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
   147
        for o, f in opmap:
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
   148
            if ops[o]:
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
   149
                l = [ f(n) for n,t in lines ]
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
   150
                m = max(map(len, l))
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
   151
                pieces.append([ "%*s" % (m, x) for x in l])
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
   152
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
   153
        for p,l in zip(zip(*pieces), lines):
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
   154
            u.write(" ".join(p) + ": " + l[1])
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
   155
245
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
   156
def branch(ui, path):
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
   157
    '''branch from a local repository'''
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
   158
    # this should eventually support remote repos
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
   159
    os.system("cp -al %s/.hg .hg" % path)
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
   160
248
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
   161
def cat(ui, repo, file, rev = []):
255
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
   162
    """output the latest or given revision of a file"""
248
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
   163
    r = repo.file(file)
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
   164
    n = r.tip()
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
   165
    if rev: n = r.lookup(rev)
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
   166
    sys.stdout.write(r.read(n))
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
   167
245
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
   168
def commit(ui, repo, *files):
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
   169
    """commit the specified files or all outstanding changes"""
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
   170
    repo.commit(relpath(repo, files))
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
   171
248
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
   172
def debugaddchangegroup(ui, repo):
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
   173
    data = sys.stdin.read()
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
   174
    repo.addchangegroup(data)
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
   175
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
   176
def debugchangegroup(ui, repo, roots):
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
   177
    newer = repo.newer(map(repo.lookup, roots))
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
   178
    for chunk in repo.changegroup(newer):
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
   179
        sys.stdout.write(chunk)
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
   180
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
   181
def debugindex(ui, file):
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
   182
    r = hg.revlog(open, file, "")
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
   183
    print "   rev    offset  length   base linkrev"+\
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
   184
          " p1           p2           nodeid"
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
   185
    for i in range(r.count()):
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
   186
        e = r.index[i]
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
   187
        print "% 6d % 9d % 7d % 6d % 7d %s.. %s.. %s.." % (
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
   188
            i, e[0], e[1], e[2], e[3],
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
   189
            hg.hex(e[4][:5]), hg.hex(e[5][:5]), hg.hex(e[6][:5]))
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
   190
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
   191
def debugindexdot(ui, file):
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
   192
    r = hg.revlog(open, file, "")
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
   193
    print "digraph G {"
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
   194
    for i in range(r.count()):
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
   195
        e = r.index[i]
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
   196
        print "\t%d -> %d" % (r.rev(e[4]), i)
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
   197
        if e[5] != hg.nullid:
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
   198
            print "\t%d -> %d" % (r.rev(e[5]), i)
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
   199
    print "}"
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
   200
245
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
   201
def diff(ui, repo, *files, **opts):
255
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
   202
    """diff working directory (or selected files)"""
245
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
   203
    revs = []
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
   204
    if opts['rev']:
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
   205
        revs = map(lambda x: repo.lookup(x), opts['rev'])
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
   206
    
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
   207
    if len(revs) > 2:
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
   208
        self.ui.warn("too many revisions to diff\n")
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
   209
        sys.exit(1)
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
   210
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
   211
    if files:
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
   212
        files = relpath(repo, files)
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
   213
    else:
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
   214
        files = relpath(repo, [""])
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
   215
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
   216
    dodiff(repo, files, *revs)
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
   217
246
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   218
def export(ui, repo, changeset):
255
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
   219
    """dump the changeset header and diffs for a revision"""
246
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   220
    node = repo.lookup(changeset)
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   221
    prev, other = repo.changelog.parents(node)
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   222
    change = repo.changelog.read(node)
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   223
    print "# HG changeset patch"
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   224
    print "# User %s" % change[1]
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   225
    print "# Node ID %s" % hg.hex(node)
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   226
    print "# Parent  %s" % hg.hex(prev)
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   227
    print
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   228
    if other != hg.nullid:
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   229
        print "# Parent  %s" % hg.hex(other)
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   230
    print change[4].rstrip()
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   231
    print
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   232
    
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   233
    dodiff(repo, None, prev, node)
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   234
245
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
   235
def forget(ui, repo, file, *files):
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
   236
    """don't add the specified files on the next commit"""
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
   237
    repo.forget(relpath(repo, (file,) + files))
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
   238
221
2bfe525ef6ca Beginning of multi-head support
mpm@selenic.com
parents: 220
diff changeset
   239
def heads(ui, repo):
2bfe525ef6ca Beginning of multi-head support
mpm@selenic.com
parents: 220
diff changeset
   240
    '''show current repository heads'''
2bfe525ef6ca Beginning of multi-head support
mpm@selenic.com
parents: 220
diff changeset
   241
    for n in repo.changelog.heads():
2bfe525ef6ca Beginning of multi-head support
mpm@selenic.com
parents: 220
diff changeset
   242
        i = repo.changelog.rev(n)
2bfe525ef6ca Beginning of multi-head support
mpm@selenic.com
parents: 220
diff changeset
   243
        changes = repo.changelog.read(n)
2bfe525ef6ca Beginning of multi-head support
mpm@selenic.com
parents: 220
diff changeset
   244
        (p1, p2) = repo.changelog.parents(n)
2bfe525ef6ca Beginning of multi-head support
mpm@selenic.com
parents: 220
diff changeset
   245
        (h, h1, h2) = map(hg.hex, (n, p1, p2))
2bfe525ef6ca Beginning of multi-head support
mpm@selenic.com
parents: 220
diff changeset
   246
        (i1, i2) = map(repo.changelog.rev, (p1, p2))
2bfe525ef6ca Beginning of multi-head support
mpm@selenic.com
parents: 220
diff changeset
   247
        print "rev:      %4d:%s" % (i, h)
2bfe525ef6ca Beginning of multi-head support
mpm@selenic.com
parents: 220
diff changeset
   248
        print "parents:  %4d:%s" % (i1, h1)
2bfe525ef6ca Beginning of multi-head support
mpm@selenic.com
parents: 220
diff changeset
   249
        if i2: print "          %4d:%s" % (i2, h2)
2bfe525ef6ca Beginning of multi-head support
mpm@selenic.com
parents: 220
diff changeset
   250
        print "manifest: %4d:%s" % (repo.manifest.rev(changes[0]),
2bfe525ef6ca Beginning of multi-head support
mpm@selenic.com
parents: 220
diff changeset
   251
                                    hg.hex(changes[0]))
2bfe525ef6ca Beginning of multi-head support
mpm@selenic.com
parents: 220
diff changeset
   252
        print "user:", changes[1]
2bfe525ef6ca Beginning of multi-head support
mpm@selenic.com
parents: 220
diff changeset
   253
        print "date:", time.asctime(
2bfe525ef6ca Beginning of multi-head support
mpm@selenic.com
parents: 220
diff changeset
   254
            time.localtime(float(changes[2].split(' ')[0])))
2bfe525ef6ca Beginning of multi-head support
mpm@selenic.com
parents: 220
diff changeset
   255
        if ui.verbose: print "files:", " ".join(changes[3])
2bfe525ef6ca Beginning of multi-head support
mpm@selenic.com
parents: 220
diff changeset
   256
        print "description:"
2bfe525ef6ca Beginning of multi-head support
mpm@selenic.com
parents: 220
diff changeset
   257
        print changes[4]
2bfe525ef6ca Beginning of multi-head support
mpm@selenic.com
parents: 220
diff changeset
   258
246
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   259
def history(ui, repo):
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   260
    """show the changelog history"""
270
5a80ed2158c8 Reverse order of hg log and hg history lists
mpm@selenic.com
parents: 268
diff changeset
   261
    for i in range(repo.changelog.count() - 1, -1, -1):
246
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   262
        n = repo.changelog.node(i)
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   263
        changes = repo.changelog.read(n)
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   264
        (p1, p2) = repo.changelog.parents(n)
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   265
        (h, h1, h2) = map(hg.hex, (n, p1, p2))
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   266
        (i1, i2) = map(repo.changelog.rev, (p1, p2))
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   267
        print "rev:      %4d:%s" % (i, h)
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   268
        print "parents:  %4d:%s" % (i1, h1)
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   269
        if i2: print "          %4d:%s" % (i2, h2)
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   270
        print "manifest: %4d:%s" % (repo.manifest.rev(changes[0]),
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   271
                                    hg.hex(changes[0]))
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   272
        print "user:", changes[1]
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   273
        print "date:", time.asctime(
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   274
            time.localtime(float(changes[2].split(' ')[0])))
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   275
        if ui.verbose: print "files:", " ".join(changes[3])
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   276
        print "description:"
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   277
        print changes[4]
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   278
255
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
   279
def init(ui):
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
   280
    """create a repository"""
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
   281
    hg.repository(ui, ".", create=1)
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
   282
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
   283
def log(ui, repo, f):
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
   284
    """show the revision history of a single file"""
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
   285
    f = relpath(repo, [f])[0]
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
   286
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
   287
    r = repo.file(f)
270
5a80ed2158c8 Reverse order of hg log and hg history lists
mpm@selenic.com
parents: 268
diff changeset
   288
    for i in range(r.count() - 1, -1, -1):
255
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
   289
        n = r.node(i)
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
   290
        (p1, p2) = r.parents(n)
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
   291
        (h, h1, h2) = map(hg.hex, (n, p1, p2))
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
   292
        (i1, i2) = map(r.rev, (p1, p2))
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
   293
        cr = r.linkrev(n)
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
   294
        cn = hg.hex(repo.changelog.node(cr))
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
   295
        print "rev:       %4d:%s" % (i, h)
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
   296
        print "changeset: %4d:%s" % (cr, cn)
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
   297
        print "parents:   %4d:%s" % (i1, h1)
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
   298
        if i2: print "           %4d:%s" % (i2, h2)
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
   299
        changes = repo.changelog.read(repo.changelog.node(cr))
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
   300
        print "user: %s" % changes[1]
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
   301
        print "date: %s" % time.asctime(
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
   302
            time.localtime(float(changes[2].split(' ')[0])))
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
   303
        print "description:"
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
   304
        print changes[4].rstrip()
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
   305
        print
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
   306
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
   307
def manifest(ui, repo, rev = []):
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
   308
    """output the latest or given revision of the project manifest"""
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
   309
    n = repo.manifest.tip()
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
   310
    if rev:
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
   311
        n = repo.manifest.lookup(rev)
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
   312
    m = repo.manifest.read(n)
276
10e325db7347 add tracking of execute permissions
mpm@selenic.com
parents: 275
diff changeset
   313
    mf = repo.manifest.readflags(n)
255
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
   314
    files = m.keys()
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
   315
    files.sort()
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
   316
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
   317
    for f in files:
276
10e325db7347 add tracking of execute permissions
mpm@selenic.com
parents: 275
diff changeset
   318
        ui.write("%40s %3s %s\n" % (hg.hex(m[f]), mf[f] and "755" or "644", f))
255
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
   319
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
   320
def parents(ui, repo, node = None):
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
   321
    '''show the parents of the current working dir'''
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
   322
    if node:
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
   323
        p = repo.changelog.parents(repo.lookup(hg.bin(node)))
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
   324
    else:
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
   325
        p = repo.dirstate.parents()
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
   326
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
   327
    for n in p:
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
   328
        if n != hg.nullid:
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
   329
            ui.write("%d:%s\n" % (repo.changelog.rev(n), hg.hex(n)))
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
   330
266
4af7677de4a9 Fix argument processing for patch and rawcommit
mpm@selenic.com
parents: 264
diff changeset
   331
def patch(ui, repo, patches, **opts):
246
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   332
    """import an ordered set of patches"""
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   333
    try:
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   334
        import psyco
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   335
        psyco.full()
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   336
    except:
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   337
        pass
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   338
    
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   339
    d = opts["base"]
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   340
    strip = opts["strip"]
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   341
    quiet = opts["quiet"] and "> /dev/null" or ""
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   342
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   343
    for patch in patches:
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   344
        ui.status("applying %s\n" % patch)
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   345
        pf = os.path.join(d, patch)
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   346
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   347
        text = ""
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   348
        for l in file(pf):
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   349
            if l[:4] == "--- ": break
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   350
            text += l
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   351
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   352
        f = os.popen("lsdiff --strip %d %s" % (strip, pf))
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   353
        files = filter(None, map(lambda x: x.rstrip(), f.read().splitlines()))
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   354
        f.close()
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   355
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   356
        if files:
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   357
            if os.system("patch -p%d < %s %s" % (strip, pf, quiet)):
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   358
                raise "patch failed!"
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   359
        repo.commit(files, text)
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   360
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   361
def pull(ui, repo, source):
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   362
    """pull changes from the specified source"""
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   363
    paths = {}
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   364
    try:
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   365
        pf = os.path.expanduser("~/.hgpaths")
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   366
        for l in file(pf):
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   367
            name, path = l.split()
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   368
            paths[name] = path
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   369
    except IOError:
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   370
        pass
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   371
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   372
    if source in paths: source = paths[source]
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   373
    
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   374
    other = hg.repository(ui, source)
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   375
    cg = repo.getchangegroup(other)
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   376
    repo.addchangegroup(cg)
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   377
266
4af7677de4a9 Fix argument processing for patch and rawcommit
mpm@selenic.com
parents: 264
diff changeset
   378
def rawcommit(ui, repo, files, **rc):
246
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   379
    "raw commit interface"
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   380
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   381
    text = rc['text']
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   382
    if not text and rc['logfile']:
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   383
        try: text = open(rc['logfile']).read()
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   384
        except IOError: pass
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   385
    if not text and not rc['logfile']:
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   386
        print "missing commit text"
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   387
        return 1
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   388
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   389
    files = relpath(repo, files)
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   390
    if rc['files']:
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   391
        files += open(rc['files']).read().splitlines()
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   392
        
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   393
    repo.rawcommit(files, text, rc['user'], rc['date'], *rc['parent'])
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   394
 
245
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
   395
def recover(ui, repo):
255
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
   396
    """roll back an interrupted transaction"""
245
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
   397
    repo.recover()
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
   398
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
   399
def remove(ui, repo, file, *files):
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
   400
    """remove the specified files on the next commit"""
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
   401
    repo.remove(relpath(repo, (file,) + files))
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
   402
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
   403
def serve(ui, repo, **opts):
255
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
   404
    """export the repository via HTTP"""
245
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
   405
    hgweb.server(repo.root, opts["name"], opts["templates"],
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
   406
                 opts["address"], opts["port"])
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
   407
    
213
d2172916ef6c commands: migrate status and branch
mpm@selenic.com
parents: 212
diff changeset
   408
def status(ui, repo):
d2172916ef6c commands: migrate status and branch
mpm@selenic.com
parents: 212
diff changeset
   409
    '''show changed files in the working directory
d2172916ef6c commands: migrate status and branch
mpm@selenic.com
parents: 212
diff changeset
   410
245
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
   411
    C = changed
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
   412
    A = added
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
   413
    R = removed
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
   414
    ? = not tracked'''
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
   415
    
230
00ea3613f82c make diffdir default to dirstate.parents()
mpm@selenic.com
parents: 227
diff changeset
   416
    (c, a, d, u) = repo.diffdir(repo.root)
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 219
diff changeset
   417
    (c, a, d, u) = map(lambda x: relfilter(repo, x), (c, a, d, u))
213
d2172916ef6c commands: migrate status and branch
mpm@selenic.com
parents: 212
diff changeset
   418
d2172916ef6c commands: migrate status and branch
mpm@selenic.com
parents: 212
diff changeset
   419
    for f in c: print "C", f
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 219
diff changeset
   420
    for f in a: print "A", f
213
d2172916ef6c commands: migrate status and branch
mpm@selenic.com
parents: 212
diff changeset
   421
    for f in d: print "R", f
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 219
diff changeset
   422
    for f in u: print "?", f
213
d2172916ef6c commands: migrate status and branch
mpm@selenic.com
parents: 212
diff changeset
   423
248
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
   424
def tags(ui, repo):
255
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
   425
    """list repository tags"""
248
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
   426
    repo.lookup(0) # prime the cache
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
   427
    i = repo.tags.items()
257
65dccc4555c2 Sort tags in revision order
mpm@selenic.com
parents: 255
diff changeset
   428
    n = []
65dccc4555c2 Sort tags in revision order
mpm@selenic.com
parents: 255
diff changeset
   429
    for e in i:
65dccc4555c2 Sort tags in revision order
mpm@selenic.com
parents: 255
diff changeset
   430
        try:
65dccc4555c2 Sort tags in revision order
mpm@selenic.com
parents: 255
diff changeset
   431
            l = repo.changelog.rev(e[1])
65dccc4555c2 Sort tags in revision order
mpm@selenic.com
parents: 255
diff changeset
   432
        except KeyError:
65dccc4555c2 Sort tags in revision order
mpm@selenic.com
parents: 255
diff changeset
   433
            l = -2
65dccc4555c2 Sort tags in revision order
mpm@selenic.com
parents: 255
diff changeset
   434
        n.append((l, e))
65dccc4555c2 Sort tags in revision order
mpm@selenic.com
parents: 255
diff changeset
   435
65dccc4555c2 Sort tags in revision order
mpm@selenic.com
parents: 255
diff changeset
   436
    n.sort()
65dccc4555c2 Sort tags in revision order
mpm@selenic.com
parents: 255
diff changeset
   437
    n.reverse()
65dccc4555c2 Sort tags in revision order
mpm@selenic.com
parents: 255
diff changeset
   438
    i = [ e[1] for e in n ]
248
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
   439
    for k, n in i:
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
   440
        try:
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
   441
            r = repo.changelog.rev(n)
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
   442
        except KeyError:
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
   443
            r = "?"
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
   444
        print "%-30s %5d:%s" % (k, repo.changelog.rev(n), hg.hex(n))
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
   445
245
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
   446
def tip(ui, repo):
255
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
   447
    """show the tip revision"""
245
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
   448
    n = repo.changelog.tip()
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
   449
    t = repo.changelog.rev(n)
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
   450
    ui.status("%d:%s\n" % (t, hg.hex(n)))
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
   451
212
48398a5353e3 commands: better argument processing, per-command help
mpm@selenic.com
parents: 211
diff changeset
   452
def undo(ui, repo):
255
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
   453
    """undo the last transaction"""
210
d2badbd7d1ad hg undo: fixup working dir state
mpm@selenic.com
parents: 209
diff changeset
   454
    repo.undo()
d2badbd7d1ad hg undo: fixup working dir state
mpm@selenic.com
parents: 209
diff changeset
   455
275
61d45b0ba8fb various merge improvements
mpm@selenic.com
parents: 270
diff changeset
   456
def update(ui, repo, node=None, merge=False, clean=False):
254
c03f58e5fd2d unify checkout and resolve into update
mpm@selenic.com
parents: 252
diff changeset
   457
    '''update or merge working directory
c03f58e5fd2d unify checkout and resolve into update
mpm@selenic.com
parents: 252
diff changeset
   458
c03f58e5fd2d unify checkout and resolve into update
mpm@selenic.com
parents: 252
diff changeset
   459
    If there are no outstanding changes in the working directory and
c03f58e5fd2d unify checkout and resolve into update
mpm@selenic.com
parents: 252
diff changeset
   460
    there is a linear relationship between the current version and the
c03f58e5fd2d unify checkout and resolve into update
mpm@selenic.com
parents: 252
diff changeset
   461
    requested version, the result is the requested version.
c03f58e5fd2d unify checkout and resolve into update
mpm@selenic.com
parents: 252
diff changeset
   462
c03f58e5fd2d unify checkout and resolve into update
mpm@selenic.com
parents: 252
diff changeset
   463
    Otherwise the result is a merge between the contents of the
c03f58e5fd2d unify checkout and resolve into update
mpm@selenic.com
parents: 252
diff changeset
   464
    current working directory and the requested version. Files that
c03f58e5fd2d unify checkout and resolve into update
mpm@selenic.com
parents: 252
diff changeset
   465
    changed between either parent are marked as changed for the next
c03f58e5fd2d unify checkout and resolve into update
mpm@selenic.com
parents: 252
diff changeset
   466
    commit and a commit must be performed before any further updates
c03f58e5fd2d unify checkout and resolve into update
mpm@selenic.com
parents: 252
diff changeset
   467
    are allowed.
c03f58e5fd2d unify checkout and resolve into update
mpm@selenic.com
parents: 252
diff changeset
   468
    '''
c03f58e5fd2d unify checkout and resolve into update
mpm@selenic.com
parents: 252
diff changeset
   469
    node = node and repo.lookup(node) or repo.changelog.tip()
275
61d45b0ba8fb various merge improvements
mpm@selenic.com
parents: 270
diff changeset
   470
    return repo.update(node, allow=merge, force=clean)
254
c03f58e5fd2d unify checkout and resolve into update
mpm@selenic.com
parents: 252
diff changeset
   471
247
863b508c5b36 migrate verify
mpm@selenic.com
parents: 246
diff changeset
   472
def verify(ui, repo):
863b508c5b36 migrate verify
mpm@selenic.com
parents: 246
diff changeset
   473
    """verify the integrity of the repository"""
863b508c5b36 migrate verify
mpm@selenic.com
parents: 246
diff changeset
   474
    return repo.verify()
863b508c5b36 migrate verify
mpm@selenic.com
parents: 246
diff changeset
   475
255
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
   476
# Command options and aliases are listed here, alphabetically
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
   477
209
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
   478
table = {
245
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
   479
    "add": (add, [], "hg add [files]"),
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
   480
    "addremove": (addremove, [], "hg addremove"),
209
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
   481
    "ann|annotate": (annotate,
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
   482
                     [('r', 'revision', '', 'revision'),
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
   483
                      ('u', 'user', None, 'show user'),
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
   484
                      ('n', 'number', None, 'show revision number'),
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
   485
                      ('c', 'changeset', None, 'show changeset')],
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
   486
                     'hg annotate [-u] [-c] [-n] [-r id] [files]'),
245
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
   487
    "branch|clone": (branch, [], 'hg branch [path]'),
248
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
   488
    "cat|dump": (cat, [], 'hg cat <file> [rev]'),
245
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
   489
    "commit|ci": (commit, [], 'hg commit [files]'),
248
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
   490
    "debugaddchangegroup": (debugaddchangegroup, [], 'debugaddchangegroup'),
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
   491
    "debugchangegroup": (debugchangegroup, [], 'debugchangegroup [roots]'),
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
   492
    "debugindex": (debugindex, [], 'debugindex <file>'),
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
   493
    "debugindexdot": (debugindexdot, [], 'debugindexdot <file>'),
245
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
   494
    "diff": (diff, [('r', 'rev', [], 'revision')],
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
   495
             'hg diff [-r A] [-r B] [files]'),
246
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   496
    "export": (export, [], "hg export <changeset>"),
245
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
   497
    "forget": (forget, [], "hg forget [files]"),
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
   498
    "heads": (heads, [], 'hg heads'),
246
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   499
    "history": (history, [], 'hg history'),
245
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
   500
    "help": (help, [], 'hg help [command]'),
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
   501
    "init": (init, [], 'hg init'),
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
   502
    "log": (log, [], 'hg log <file>'),
248
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
   503
    "manifest|dumpmanifest": (manifest, [], 'hg manifest [rev]'),
227
f57519cddd3d move repo.current to dirstate.parents()
mpm@selenic.com
parents: 221
diff changeset
   504
    "parents": (parents, [], 'hg parents [node]'),
246
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   505
    "patch|import": (patch,
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   506
                     [('p', 'strip', 1, 'path strip'),
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   507
                      ('b', 'base', "", 'base path'),
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   508
                      ('q', 'quiet', "", 'silence diff')],
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   509
                     "hg import [options] patches"),
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   510
    "pull|merge": (pull, [], 'hg pull [source]'),
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   511
    "rawcommit": (rawcommit,
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   512
                  [('p', 'parent', [], 'parent'),
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   513
                   ('d', 'date', "", 'data'),
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   514
                   ('u', 'user', "", 'user'),
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   515
                   ('F', 'files', "", 'file list'),
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   516
                   ('t', 'text', "", 'commit text'),
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   517
                   ('l', 'logfile', "", 'commit text file')],
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   518
                  'hg rawcommit [options] [files]'),
245
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
   519
    "recover": (recover, [], "hg recover"),
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
   520
    "remove": (remove, [], "hg remove [files]"),
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
   521
    "serve": (serve, [('p', 'port', 8000, 'listen port'),
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
   522
                      ('a', 'address', '', 'interface address'),
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
   523
                      ('n', 'name', os.getcwd(), 'repository name'),
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
   524
                      ('t', 'templates', "", 'template map')],
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
   525
              "hg serve [options]"),
213
d2172916ef6c commands: migrate status and branch
mpm@selenic.com
parents: 212
diff changeset
   526
    "status": (status, [], 'hg status'),
248
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
   527
    "tags": (tags, [], 'hg tags'),
245
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
   528
    "tip": (tip, [], 'hg tip'),
210
d2badbd7d1ad hg undo: fixup working dir state
mpm@selenic.com
parents: 209
diff changeset
   529
    "undo": (undo, [], 'hg undo'),
275
61d45b0ba8fb various merge improvements
mpm@selenic.com
parents: 270
diff changeset
   530
    "update|up|checkout|co|resolve": (update,
61d45b0ba8fb various merge improvements
mpm@selenic.com
parents: 270
diff changeset
   531
                                      [('m', 'merge', None,
61d45b0ba8fb various merge improvements
mpm@selenic.com
parents: 270
diff changeset
   532
                                        'allow merging of conflicts'),
61d45b0ba8fb various merge improvements
mpm@selenic.com
parents: 270
diff changeset
   533
                                       ('C', 'clean', None,
61d45b0ba8fb various merge improvements
mpm@selenic.com
parents: 270
diff changeset
   534
                                        'overwrite locally modified files')],
61d45b0ba8fb various merge improvements
mpm@selenic.com
parents: 270
diff changeset
   535
                                       'hg update [options] [node]'),
247
863b508c5b36 migrate verify
mpm@selenic.com
parents: 246
diff changeset
   536
    "verify": (verify, [], 'hg verify'),
209
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
   537
    }
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
   538
248
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
   539
norepo = "init branch help debugindex debugindexdot"
209
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
   540
212
48398a5353e3 commands: better argument processing, per-command help
mpm@selenic.com
parents: 211
diff changeset
   541
def find(cmd):
48398a5353e3 commands: better argument processing, per-command help
mpm@selenic.com
parents: 211
diff changeset
   542
    i = None
48398a5353e3 commands: better argument processing, per-command help
mpm@selenic.com
parents: 211
diff changeset
   543
    for e in table.keys():
48398a5353e3 commands: better argument processing, per-command help
mpm@selenic.com
parents: 211
diff changeset
   544
        if re.match(e + "$", cmd):
48398a5353e3 commands: better argument processing, per-command help
mpm@selenic.com
parents: 211
diff changeset
   545
            return table[e]
48398a5353e3 commands: better argument processing, per-command help
mpm@selenic.com
parents: 211
diff changeset
   546
48398a5353e3 commands: better argument processing, per-command help
mpm@selenic.com
parents: 211
diff changeset
   547
    raise UnknownCommand(cmd)
48398a5353e3 commands: better argument processing, per-command help
mpm@selenic.com
parents: 211
diff changeset
   548
214
2d60aa9bde0a catch TERM signal in command processor
mpm@selenic.com
parents: 213
diff changeset
   549
class SignalInterrupt(Exception): pass
2d60aa9bde0a catch TERM signal in command processor
mpm@selenic.com
parents: 213
diff changeset
   550
2d60aa9bde0a catch TERM signal in command processor
mpm@selenic.com
parents: 213
diff changeset
   551
def catchterm(*args):
2d60aa9bde0a catch TERM signal in command processor
mpm@selenic.com
parents: 213
diff changeset
   552
    raise SignalInterrupt
2d60aa9bde0a catch TERM signal in command processor
mpm@selenic.com
parents: 213
diff changeset
   553
249
619e775aa7f9 import and startup cleanups
mpm@selenic.com
parents: 248
diff changeset
   554
def run():
619e775aa7f9 import and startup cleanups
mpm@selenic.com
parents: 248
diff changeset
   555
    sys.exit(dispatch(sys.argv[1:]))
619e775aa7f9 import and startup cleanups
mpm@selenic.com
parents: 248
diff changeset
   556
209
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
   557
def dispatch(args):
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
   558
    options = {}
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
   559
    opts = [('v', 'verbose', None, 'verbose'),
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
   560
            ('d', 'debug', None, 'debug'),
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
   561
            ('q', 'quiet', None, 'quiet'),
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
   562
            ('y', 'noninteractive', None, 'run non-interactively'),
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
   563
            ]
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
   564
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
   565
    args = fancyopts.fancyopts(args, opts, options,
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
   566
                               'hg [options] <command> [options] [files]')
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
   567
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
   568
    if not args:
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
   569
        cmd = "help"
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
   570
    else:
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
   571
        cmd, args = args[0], args[1:]
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
   572
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
   573
    u = ui.ui(options["verbose"], options["debug"], options["quiet"],
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
   574
           not options["noninteractive"])
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
   575
252
5eda6c542978 Handle unknown commands nicely
mpm@selenic.com
parents: 250
diff changeset
   576
    try:
5eda6c542978 Handle unknown commands nicely
mpm@selenic.com
parents: 250
diff changeset
   577
        i = find(cmd)
5eda6c542978 Handle unknown commands nicely
mpm@selenic.com
parents: 250
diff changeset
   578
    except UnknownCommand:
268
1634a7ea6748 unknown command fixups
mpm@selenic.com
parents: 266
diff changeset
   579
        u.warn("hg: unknown command '%s'\n" % cmd)
252
5eda6c542978 Handle unknown commands nicely
mpm@selenic.com
parents: 250
diff changeset
   580
        help(u)
5eda6c542978 Handle unknown commands nicely
mpm@selenic.com
parents: 250
diff changeset
   581
        sys.exit(1)
209
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
   582
214
2d60aa9bde0a catch TERM signal in command processor
mpm@selenic.com
parents: 213
diff changeset
   583
    signal.signal(signal.SIGTERM, catchterm)
2d60aa9bde0a catch TERM signal in command processor
mpm@selenic.com
parents: 213
diff changeset
   584
209
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
   585
    cmdoptions = {}
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
   586
    args = fancyopts.fancyopts(args, i[1], cmdoptions, i[2])
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
   587
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
   588
    if cmd not in norepo.split():
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
   589
        repo = hg.repository(ui = u)
212
48398a5353e3 commands: better argument processing, per-command help
mpm@selenic.com
parents: 211
diff changeset
   590
        d = lambda: i[0](u, repo, *args, **cmdoptions)
209
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
   591
    else:
212
48398a5353e3 commands: better argument processing, per-command help
mpm@selenic.com
parents: 211
diff changeset
   592
        d = lambda: i[0](u, *args, **cmdoptions)
209
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
   593
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
   594
    try:
246
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
   595
        return d()
214
2d60aa9bde0a catch TERM signal in command processor
mpm@selenic.com
parents: 213
diff changeset
   596
    except SignalInterrupt:
2d60aa9bde0a catch TERM signal in command processor
mpm@selenic.com
parents: 213
diff changeset
   597
        u.warn("killed!\n")
209
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
   598
    except KeyboardInterrupt:
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
   599
        u.warn("interrupted!\n")
250
45ee7c4cae4f Catch broken pipes in command interpreter
mpm@selenic.com
parents: 249
diff changeset
   600
    except IOError, inst:
45ee7c4cae4f Catch broken pipes in command interpreter
mpm@selenic.com
parents: 249
diff changeset
   601
        if inst.errno == 32:
45ee7c4cae4f Catch broken pipes in command interpreter
mpm@selenic.com
parents: 249
diff changeset
   602
            u.warn("broken pipe\n")
45ee7c4cae4f Catch broken pipes in command interpreter
mpm@selenic.com
parents: 249
diff changeset
   603
        else:
45ee7c4cae4f Catch broken pipes in command interpreter
mpm@selenic.com
parents: 249
diff changeset
   604
            raise
212
48398a5353e3 commands: better argument processing, per-command help
mpm@selenic.com
parents: 211
diff changeset
   605
    except TypeError, inst:
48398a5353e3 commands: better argument processing, per-command help
mpm@selenic.com
parents: 211
diff changeset
   606
        # was this an argument error?
48398a5353e3 commands: better argument processing, per-command help
mpm@selenic.com
parents: 211
diff changeset
   607
        tb = traceback.extract_tb(sys.exc_info()[2])
48398a5353e3 commands: better argument processing, per-command help
mpm@selenic.com
parents: 211
diff changeset
   608
        if len(tb) > 2: # no
48398a5353e3 commands: better argument processing, per-command help
mpm@selenic.com
parents: 211
diff changeset
   609
            raise
275
61d45b0ba8fb various merge improvements
mpm@selenic.com
parents: 270
diff changeset
   610
        raise
212
48398a5353e3 commands: better argument processing, per-command help
mpm@selenic.com
parents: 211
diff changeset
   611
        u.warn("%s: invalid arguments\n" % i[0].__name__)
48398a5353e3 commands: better argument processing, per-command help
mpm@selenic.com
parents: 211
diff changeset
   612
        u.warn("syntax: %s\n" % i[2])
48398a5353e3 commands: better argument processing, per-command help
mpm@selenic.com
parents: 211
diff changeset
   613
        sys.exit(-1)