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