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