annotate hglib/client.py @ 35:1e33bbea23e5

client: handle spaces correctly in status()
author Idan Kamara <idankk86@gmail.com>
date Sun, 14 Aug 2011 00:56:33 +0300
parents f6e1d9a6e0cd
children 5506a241c826
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
21
ffef7df076e8 client: rewrite config()
Idan Kamara <idankk86@gmail.com>
parents: 20
diff changeset
1 import subprocess, os, struct, cStringIO, collections, re
6
96f8c5095e2e client: use --template instead of --style for cset display
Idan Kamara <idankk86@gmail.com>
parents: 5
diff changeset
2 import hglib, error, util, templates
2
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
3
4
a3a9cf58801f client: use the cmdbuilder
Idan Kamara <idankk86@gmail.com>
parents: 2
diff changeset
4 from util import cmdbuilder
a3a9cf58801f client: use the cmdbuilder
Idan Kamara <idankk86@gmail.com>
parents: 2
diff changeset
5
2
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
6 class hgclient(object):
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
7 inputfmt = '>I'
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
8 outputfmt = '>cI'
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
9 outputfmtsize = struct.calcsize(outputfmt)
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
10 retfmt = '>i'
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
11
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
12 revision = collections.namedtuple('revision', 'rev, node, tags, '
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
13 'branch, author, desc')
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
14
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
15 def __init__(self, path, encoding, configs):
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
16 args = [hglib.HGPATH, 'serve', '--cmdserver', 'pipe']
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
17 if path:
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
18 args += ['-R', path]
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
19 if configs:
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
20 args += ['--config'] + configs
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
21 env = dict(os.environ)
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
22 if encoding:
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
23 env['HGENCODING'] = encoding
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
24
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
25 self.server = subprocess.Popen(args, stdin=subprocess.PIPE,
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
26 stdout=subprocess.PIPE, env=env)
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
27
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
28 self._readhello()
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
29
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
30 def _readhello(self):
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
31 """ read the hello message the server sends when started """
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
32 ch, msg = self._readchannel()
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
33 assert ch == 'o'
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
34
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
35 msg = msg.split('\n')
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
36
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
37 self.capabilities = msg[0][len('capabilities: '):]
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
38 if not self.capabilities:
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
39 raise error.ResponseError("bad hello message: expected 'capabilities: '"
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
40 ", got %r" % msg[0])
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
41
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
42 self.capabilities = set(self.capabilities.split())
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
43
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
44 # at the very least the server should be able to run commands
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
45 assert 'runcommand' in self.capabilities
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
46
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
47 self._encoding = msg[1][len('encoding: '):]
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
48 if not self._encoding:
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
49 raise error.ResponseError("bad hello message: expected 'encoding: '"
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
50 ", got %r" % msg[1])
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
51
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
52 def _readchannel(self):
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
53 data = self.server.stdout.read(hgclient.outputfmtsize)
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
54 if not data:
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
55 raise error.ServerError()
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
56 channel, length = struct.unpack(hgclient.outputfmt, data)
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
57 if channel in 'IL':
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
58 return channel, length
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
59 else:
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
60 return channel, self.server.stdout.read(length)
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
61
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
62 def _parserevs(self, splitted):
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
63 ''' splitted is a list of fields according to our rev.style, where each 6
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
64 fields compose one revision. '''
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
65 return [self.revision._make(rev) for rev in util.grouper(6, splitted)]
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
66
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
67 def runcommand(self, args, inchannels, outchannels):
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
68 def writeblock(data):
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
69 self.server.stdin.write(struct.pack(self.inputfmt, len(data)))
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
70 self.server.stdin.write(data)
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
71 self.server.stdin.flush()
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
72
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
73 if not self.server:
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
74 raise ValueError("server not connected")
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
75
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
76 self.server.stdin.write('runcommand\n')
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
77 writeblock('\0'.join(args))
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
78
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
79 while True:
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
80 channel, data = self._readchannel()
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
81
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
82 # input channels
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
83 if channel in inchannels:
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
84 writeblock(inchannels[channel](data))
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
85 # output channels
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
86 elif channel in outchannels:
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
87 outchannels[channel](data)
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
88 # result channel, command finished
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
89 elif channel == 'r':
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
90 return struct.unpack(hgclient.retfmt, data)[0]
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
91 # a channel that we don't know and can't ignore
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
92 elif channel.isupper():
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
93 raise error.ResponseError("unexpected data on required channel '%s'"
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
94 % channel)
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
95 # optional channel
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
96 else:
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
97 pass
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
98
5
3182303f388d client: rawcommand, more convenient helper to run commands instead of outputruncommand
Idan Kamara <idankk86@gmail.com>
parents: 4
diff changeset
99 def rawcommand(self, args, eh=None, prompt=None, input=None):
3182303f388d client: rawcommand, more convenient helper to run commands instead of outputruncommand
Idan Kamara <idankk86@gmail.com>
parents: 4
diff changeset
100 """
3182303f388d client: rawcommand, more convenient helper to run commands instead of outputruncommand
Idan Kamara <idankk86@gmail.com>
parents: 4
diff changeset
101 args is the cmdline (usually built using util.cmdbuilder)
3182303f388d client: rawcommand, more convenient helper to run commands instead of outputruncommand
Idan Kamara <idankk86@gmail.com>
parents: 4
diff changeset
102
3182303f388d client: rawcommand, more convenient helper to run commands instead of outputruncommand
Idan Kamara <idankk86@gmail.com>
parents: 4
diff changeset
103 eh is an error handler that is passed the return code, stdout and stderr
3182303f388d client: rawcommand, more convenient helper to run commands instead of outputruncommand
Idan Kamara <idankk86@gmail.com>
parents: 4
diff changeset
104 If no eh is given, we raise a CommandError if ret != 0
3182303f388d client: rawcommand, more convenient helper to run commands instead of outputruncommand
Idan Kamara <idankk86@gmail.com>
parents: 4
diff changeset
105
3182303f388d client: rawcommand, more convenient helper to run commands instead of outputruncommand
Idan Kamara <idankk86@gmail.com>
parents: 4
diff changeset
106 prompt is used to reply to prompts by the server
3182303f388d client: rawcommand, more convenient helper to run commands instead of outputruncommand
Idan Kamara <idankk86@gmail.com>
parents: 4
diff changeset
107 It receives the max number of bytes to return and the contents of stdout
3182303f388d client: rawcommand, more convenient helper to run commands instead of outputruncommand
Idan Kamara <idankk86@gmail.com>
parents: 4
diff changeset
108 received so far
3182303f388d client: rawcommand, more convenient helper to run commands instead of outputruncommand
Idan Kamara <idankk86@gmail.com>
parents: 4
diff changeset
109
3182303f388d client: rawcommand, more convenient helper to run commands instead of outputruncommand
Idan Kamara <idankk86@gmail.com>
parents: 4
diff changeset
110 input is used to reply to bulk data requests by the server
3182303f388d client: rawcommand, more convenient helper to run commands instead of outputruncommand
Idan Kamara <idankk86@gmail.com>
parents: 4
diff changeset
111 It receives the max number of bytes to return
3182303f388d client: rawcommand, more convenient helper to run commands instead of outputruncommand
Idan Kamara <idankk86@gmail.com>
parents: 4
diff changeset
112 """
3182303f388d client: rawcommand, more convenient helper to run commands instead of outputruncommand
Idan Kamara <idankk86@gmail.com>
parents: 4
diff changeset
113
2
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
114 out, err = cStringIO.StringIO(), cStringIO.StringIO()
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
115 outchannels = {'o' : out.write, 'e' : err.write}
5
3182303f388d client: rawcommand, more convenient helper to run commands instead of outputruncommand
Idan Kamara <idankk86@gmail.com>
parents: 4
diff changeset
116
3182303f388d client: rawcommand, more convenient helper to run commands instead of outputruncommand
Idan Kamara <idankk86@gmail.com>
parents: 4
diff changeset
117 inchannels = {}
3182303f388d client: rawcommand, more convenient helper to run commands instead of outputruncommand
Idan Kamara <idankk86@gmail.com>
parents: 4
diff changeset
118 if prompt is not None:
3182303f388d client: rawcommand, more convenient helper to run commands instead of outputruncommand
Idan Kamara <idankk86@gmail.com>
parents: 4
diff changeset
119 def func(size):
3182303f388d client: rawcommand, more convenient helper to run commands instead of outputruncommand
Idan Kamara <idankk86@gmail.com>
parents: 4
diff changeset
120 reply = prompt(size, out.getvalue())
3182303f388d client: rawcommand, more convenient helper to run commands instead of outputruncommand
Idan Kamara <idankk86@gmail.com>
parents: 4
diff changeset
121 return str(reply)
3182303f388d client: rawcommand, more convenient helper to run commands instead of outputruncommand
Idan Kamara <idankk86@gmail.com>
parents: 4
diff changeset
122 inchannels['L'] = func
3182303f388d client: rawcommand, more convenient helper to run commands instead of outputruncommand
Idan Kamara <idankk86@gmail.com>
parents: 4
diff changeset
123 if input is not None:
3182303f388d client: rawcommand, more convenient helper to run commands instead of outputruncommand
Idan Kamara <idankk86@gmail.com>
parents: 4
diff changeset
124 inchannels['I'] = input
3182303f388d client: rawcommand, more convenient helper to run commands instead of outputruncommand
Idan Kamara <idankk86@gmail.com>
parents: 4
diff changeset
125
2
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
126 ret = self.runcommand(args, inchannels, outchannels)
5
3182303f388d client: rawcommand, more convenient helper to run commands instead of outputruncommand
Idan Kamara <idankk86@gmail.com>
parents: 4
diff changeset
127 out, err = out.getvalue(), err.getvalue()
3182303f388d client: rawcommand, more convenient helper to run commands instead of outputruncommand
Idan Kamara <idankk86@gmail.com>
parents: 4
diff changeset
128
3182303f388d client: rawcommand, more convenient helper to run commands instead of outputruncommand
Idan Kamara <idankk86@gmail.com>
parents: 4
diff changeset
129 if ret:
3182303f388d client: rawcommand, more convenient helper to run commands instead of outputruncommand
Idan Kamara <idankk86@gmail.com>
parents: 4
diff changeset
130 if eh is None:
3182303f388d client: rawcommand, more convenient helper to run commands instead of outputruncommand
Idan Kamara <idankk86@gmail.com>
parents: 4
diff changeset
131 raise error.CommandError(args, ret, out, err)
3182303f388d client: rawcommand, more convenient helper to run commands instead of outputruncommand
Idan Kamara <idankk86@gmail.com>
parents: 4
diff changeset
132 else:
3182303f388d client: rawcommand, more convenient helper to run commands instead of outputruncommand
Idan Kamara <idankk86@gmail.com>
parents: 4
diff changeset
133 return eh(ret, out, err)
3182303f388d client: rawcommand, more convenient helper to run commands instead of outputruncommand
Idan Kamara <idankk86@gmail.com>
parents: 4
diff changeset
134 return out
2
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
135
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
136 def close(self):
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
137 self.server.stdin.close()
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
138 self.server.wait()
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
139 ret = self.server.returncode
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
140 self.server = None
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
141 return ret
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
142
28
221eeb3693f4 client: add add command
Idan Kamara <idankk86@gmail.com>
parents: 27
diff changeset
143 def add(self, files=[], dryrun=False, subrepos=False, include=None,
221eeb3693f4 client: add add command
Idan Kamara <idankk86@gmail.com>
parents: 27
diff changeset
144 exclude=None):
221eeb3693f4 client: add add command
Idan Kamara <idankk86@gmail.com>
parents: 27
diff changeset
145 """
221eeb3693f4 client: add add command
Idan Kamara <idankk86@gmail.com>
parents: 27
diff changeset
146 Add the specified files on the next commit.
221eeb3693f4 client: add add command
Idan Kamara <idankk86@gmail.com>
parents: 27
diff changeset
147 If no files are given, add all files to the repository.
221eeb3693f4 client: add add command
Idan Kamara <idankk86@gmail.com>
parents: 27
diff changeset
148
221eeb3693f4 client: add add command
Idan Kamara <idankk86@gmail.com>
parents: 27
diff changeset
149 Return whether all given files were added.
221eeb3693f4 client: add add command
Idan Kamara <idankk86@gmail.com>
parents: 27
diff changeset
150 """
221eeb3693f4 client: add add command
Idan Kamara <idankk86@gmail.com>
parents: 27
diff changeset
151 if not isinstance(files, list):
221eeb3693f4 client: add add command
Idan Kamara <idankk86@gmail.com>
parents: 27
diff changeset
152 files = [files]
221eeb3693f4 client: add add command
Idan Kamara <idankk86@gmail.com>
parents: 27
diff changeset
153
221eeb3693f4 client: add add command
Idan Kamara <idankk86@gmail.com>
parents: 27
diff changeset
154 args = cmdbuilder('add', *files, n=dryrun, S=subrepos, I=include, X=exclude)
221eeb3693f4 client: add add command
Idan Kamara <idankk86@gmail.com>
parents: 27
diff changeset
155
221eeb3693f4 client: add add command
Idan Kamara <idankk86@gmail.com>
parents: 27
diff changeset
156 # we could use Python 3 nonlocal here...
221eeb3693f4 client: add add command
Idan Kamara <idankk86@gmail.com>
parents: 27
diff changeset
157 warnings = [False]
221eeb3693f4 client: add add command
Idan Kamara <idankk86@gmail.com>
parents: 27
diff changeset
158
221eeb3693f4 client: add add command
Idan Kamara <idankk86@gmail.com>
parents: 27
diff changeset
159 def eh(ret, out, err):
221eeb3693f4 client: add add command
Idan Kamara <idankk86@gmail.com>
parents: 27
diff changeset
160 if ret == 1:
221eeb3693f4 client: add add command
Idan Kamara <idankk86@gmail.com>
parents: 27
diff changeset
161 warnings[0] = True
221eeb3693f4 client: add add command
Idan Kamara <idankk86@gmail.com>
parents: 27
diff changeset
162 else:
221eeb3693f4 client: add add command
Idan Kamara <idankk86@gmail.com>
parents: 27
diff changeset
163 raise error.CommandError(args, ret, out, err)
221eeb3693f4 client: add add command
Idan Kamara <idankk86@gmail.com>
parents: 27
diff changeset
164
221eeb3693f4 client: add add command
Idan Kamara <idankk86@gmail.com>
parents: 27
diff changeset
165 self.rawcommand(args, eh=eh)
221eeb3693f4 client: add add command
Idan Kamara <idankk86@gmail.com>
parents: 27
diff changeset
166 return not warnings[0]
221eeb3693f4 client: add add command
Idan Kamara <idankk86@gmail.com>
parents: 27
diff changeset
167
22
297df22d6091 client: add backout command
Idan Kamara <idankk86@gmail.com>
parents: 21
diff changeset
168 def backout(self, rev, merge=False, parent=None, tool=None, message=None,
297df22d6091 client: add backout command
Idan Kamara <idankk86@gmail.com>
parents: 21
diff changeset
169 logfile=None, date=None, user=None):
297df22d6091 client: add backout command
Idan Kamara <idankk86@gmail.com>
parents: 21
diff changeset
170 if message and logfile:
297df22d6091 client: add backout command
Idan Kamara <idankk86@gmail.com>
parents: 21
diff changeset
171 raise ValueError("cannot specify both a message and a logfile")
297df22d6091 client: add backout command
Idan Kamara <idankk86@gmail.com>
parents: 21
diff changeset
172
297df22d6091 client: add backout command
Idan Kamara <idankk86@gmail.com>
parents: 21
diff changeset
173 args = cmdbuilder('backout', r=rev, merge=merge, parent=parent, t=tool,
297df22d6091 client: add backout command
Idan Kamara <idankk86@gmail.com>
parents: 21
diff changeset
174 m=message, l=logfile, d=date, u=user)
297df22d6091 client: add backout command
Idan Kamara <idankk86@gmail.com>
parents: 21
diff changeset
175
297df22d6091 client: add backout command
Idan Kamara <idankk86@gmail.com>
parents: 21
diff changeset
176 self.rawcommand(args)
297df22d6091 client: add backout command
Idan Kamara <idankk86@gmail.com>
parents: 21
diff changeset
177
23
223e463c25e0 client: add bookmark command
Idan Kamara <idankk86@gmail.com>
parents: 22
diff changeset
178 def bookmark(self, name, rev=None, force=False, delete=False, inactive=False,
223e463c25e0 client: add bookmark command
Idan Kamara <idankk86@gmail.com>
parents: 22
diff changeset
179 rename=None):
223e463c25e0 client: add bookmark command
Idan Kamara <idankk86@gmail.com>
parents: 22
diff changeset
180 args = cmdbuilder('bookmark', name, r=rev, f=force, d=delete,
223e463c25e0 client: add bookmark command
Idan Kamara <idankk86@gmail.com>
parents: 22
diff changeset
181 i=inactive, m=rename)
223e463c25e0 client: add bookmark command
Idan Kamara <idankk86@gmail.com>
parents: 22
diff changeset
182
223e463c25e0 client: add bookmark command
Idan Kamara <idankk86@gmail.com>
parents: 22
diff changeset
183 self.rawcommand(args)
223e463c25e0 client: add bookmark command
Idan Kamara <idankk86@gmail.com>
parents: 22
diff changeset
184
24
ca0d7e212cf8 client: add bookmarks command
Idan Kamara <idankk86@gmail.com>
parents: 23
diff changeset
185 def bookmarks(self):
ca0d7e212cf8 client: add bookmarks command
Idan Kamara <idankk86@gmail.com>
parents: 23
diff changeset
186 """
ca0d7e212cf8 client: add bookmarks command
Idan Kamara <idankk86@gmail.com>
parents: 23
diff changeset
187 Return the bookmarks as a list of (name, rev, node) and the
ca0d7e212cf8 client: add bookmarks command
Idan Kamara <idankk86@gmail.com>
parents: 23
diff changeset
188 index of the current one.
ca0d7e212cf8 client: add bookmarks command
Idan Kamara <idankk86@gmail.com>
parents: 23
diff changeset
189
ca0d7e212cf8 client: add bookmarks command
Idan Kamara <idankk86@gmail.com>
parents: 23
diff changeset
190 If there isn't a current one, -1 is returned as the index
ca0d7e212cf8 client: add bookmarks command
Idan Kamara <idankk86@gmail.com>
parents: 23
diff changeset
191 """
ca0d7e212cf8 client: add bookmarks command
Idan Kamara <idankk86@gmail.com>
parents: 23
diff changeset
192 out = self.rawcommand(['bookmarks'])
ca0d7e212cf8 client: add bookmarks command
Idan Kamara <idankk86@gmail.com>
parents: 23
diff changeset
193
ca0d7e212cf8 client: add bookmarks command
Idan Kamara <idankk86@gmail.com>
parents: 23
diff changeset
194 bms = []
ca0d7e212cf8 client: add bookmarks command
Idan Kamara <idankk86@gmail.com>
parents: 23
diff changeset
195 current = -1
ca0d7e212cf8 client: add bookmarks command
Idan Kamara <idankk86@gmail.com>
parents: 23
diff changeset
196 if out.rstrip() != 'no bookmarks set':
ca0d7e212cf8 client: add bookmarks command
Idan Kamara <idankk86@gmail.com>
parents: 23
diff changeset
197 for line in out.splitlines():
ca0d7e212cf8 client: add bookmarks command
Idan Kamara <idankk86@gmail.com>
parents: 23
diff changeset
198 iscurrent, line = line[0:3], line[3:]
ca0d7e212cf8 client: add bookmarks command
Idan Kamara <idankk86@gmail.com>
parents: 23
diff changeset
199 if '*' in iscurrent:
ca0d7e212cf8 client: add bookmarks command
Idan Kamara <idankk86@gmail.com>
parents: 23
diff changeset
200 current = len(bms)
ca0d7e212cf8 client: add bookmarks command
Idan Kamara <idankk86@gmail.com>
parents: 23
diff changeset
201 name, line = line.split(' ', 1)
ca0d7e212cf8 client: add bookmarks command
Idan Kamara <idankk86@gmail.com>
parents: 23
diff changeset
202 rev, node = line.split(':')
ca0d7e212cf8 client: add bookmarks command
Idan Kamara <idankk86@gmail.com>
parents: 23
diff changeset
203 bms.append((name, int(rev), node))
ca0d7e212cf8 client: add bookmarks command
Idan Kamara <idankk86@gmail.com>
parents: 23
diff changeset
204 return bms, current
ca0d7e212cf8 client: add bookmarks command
Idan Kamara <idankk86@gmail.com>
parents: 23
diff changeset
205
11
0549d00a617d client: add missing options to branch()
Idan Kamara <idankk86@gmail.com>
parents: 10
diff changeset
206 def branch(self, name=None, clean=False, force=False):
0549d00a617d client: add missing options to branch()
Idan Kamara <idankk86@gmail.com>
parents: 10
diff changeset
207 if name and clean:
0549d00a617d client: add missing options to branch()
Idan Kamara <idankk86@gmail.com>
parents: 10
diff changeset
208 raise ValueError('cannot use both name and clean')
0549d00a617d client: add missing options to branch()
Idan Kamara <idankk86@gmail.com>
parents: 10
diff changeset
209
0549d00a617d client: add missing options to branch()
Idan Kamara <idankk86@gmail.com>
parents: 10
diff changeset
210 args = cmdbuilder('branch', name, f=force, C=clean)
0549d00a617d client: add missing options to branch()
Idan Kamara <idankk86@gmail.com>
parents: 10
diff changeset
211 out = self.rawcommand(args).rstrip()
0549d00a617d client: add missing options to branch()
Idan Kamara <idankk86@gmail.com>
parents: 10
diff changeset
212
0549d00a617d client: add missing options to branch()
Idan Kamara <idankk86@gmail.com>
parents: 10
diff changeset
213 if name:
0549d00a617d client: add missing options to branch()
Idan Kamara <idankk86@gmail.com>
parents: 10
diff changeset
214 return name
0549d00a617d client: add missing options to branch()
Idan Kamara <idankk86@gmail.com>
parents: 10
diff changeset
215 elif not clean:
0549d00a617d client: add missing options to branch()
Idan Kamara <idankk86@gmail.com>
parents: 10
diff changeset
216 return out
0549d00a617d client: add missing options to branch()
Idan Kamara <idankk86@gmail.com>
parents: 10
diff changeset
217 else:
0549d00a617d client: add missing options to branch()
Idan Kamara <idankk86@gmail.com>
parents: 10
diff changeset
218 # len('reset working directory to branch ') == 34
0549d00a617d client: add missing options to branch()
Idan Kamara <idankk86@gmail.com>
parents: 10
diff changeset
219 return out[34:]
10
fce3102c19e5 client: sort commands by name
Idan Kamara <idankk86@gmail.com>
parents: 8
diff changeset
220
12
c2a9b716cd80 client: rewrite branches(), return a list of (branchname, rev, node)
Idan Kamara <idankk86@gmail.com>
parents: 11
diff changeset
221 def branches(self, active=False, closed=False):
c2a9b716cd80 client: rewrite branches(), return a list of (branchname, rev, node)
Idan Kamara <idankk86@gmail.com>
parents: 11
diff changeset
222 args = cmdbuilder('branches', a=active, c=closed)
c2a9b716cd80 client: rewrite branches(), return a list of (branchname, rev, node)
Idan Kamara <idankk86@gmail.com>
parents: 11
diff changeset
223 out = self.rawcommand(args)
10
fce3102c19e5 client: sort commands by name
Idan Kamara <idankk86@gmail.com>
parents: 8
diff changeset
224
12
c2a9b716cd80 client: rewrite branches(), return a list of (branchname, rev, node)
Idan Kamara <idankk86@gmail.com>
parents: 11
diff changeset
225 branches = []
c2a9b716cd80 client: rewrite branches(), return a list of (branchname, rev, node)
Idan Kamara <idankk86@gmail.com>
parents: 11
diff changeset
226 for line in out.rstrip().splitlines():
c2a9b716cd80 client: rewrite branches(), return a list of (branchname, rev, node)
Idan Kamara <idankk86@gmail.com>
parents: 11
diff changeset
227 name, line = line.split(' ', 1)
c2a9b716cd80 client: rewrite branches(), return a list of (branchname, rev, node)
Idan Kamara <idankk86@gmail.com>
parents: 11
diff changeset
228 rev, node = line.split(':')
c2a9b716cd80 client: rewrite branches(), return a list of (branchname, rev, node)
Idan Kamara <idankk86@gmail.com>
parents: 11
diff changeset
229 node = node.split()[0] # get rid of ' (inactive)'
c2a9b716cd80 client: rewrite branches(), return a list of (branchname, rev, node)
Idan Kamara <idankk86@gmail.com>
parents: 11
diff changeset
230 branches.append((name, int(rev), node))
10
fce3102c19e5 client: sort commands by name
Idan Kamara <idankk86@gmail.com>
parents: 8
diff changeset
231 return branches
2
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
232
10
fce3102c19e5 client: sort commands by name
Idan Kamara <idankk86@gmail.com>
parents: 8
diff changeset
233 def cat(self, files, rev=None, output=None):
fce3102c19e5 client: sort commands by name
Idan Kamara <idankk86@gmail.com>
parents: 8
diff changeset
234 args = cmdbuilder('cat', *files, r=rev, o=output)
fce3102c19e5 client: sort commands by name
Idan Kamara <idankk86@gmail.com>
parents: 8
diff changeset
235 out = self.rawcommand(args)
fce3102c19e5 client: sort commands by name
Idan Kamara <idankk86@gmail.com>
parents: 8
diff changeset
236
fce3102c19e5 client: sort commands by name
Idan Kamara <idankk86@gmail.com>
parents: 8
diff changeset
237 if not output:
fce3102c19e5 client: sort commands by name
Idan Kamara <idankk86@gmail.com>
parents: 8
diff changeset
238 return out
2
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
239
10
fce3102c19e5 client: sort commands by name
Idan Kamara <idankk86@gmail.com>
parents: 8
diff changeset
240 def clone(self, source='.', dest=None, branch=None, updaterev=None,
fce3102c19e5 client: sort commands by name
Idan Kamara <idankk86@gmail.com>
parents: 8
diff changeset
241 revrange=None):
fce3102c19e5 client: sort commands by name
Idan Kamara <idankk86@gmail.com>
parents: 8
diff changeset
242 args = cmdbuilder('clone', source, dest, b=branch, u=updaterev, r=revrange)
fce3102c19e5 client: sort commands by name
Idan Kamara <idankk86@gmail.com>
parents: 8
diff changeset
243 self.rawcommand(args)
fce3102c19e5 client: sort commands by name
Idan Kamara <idankk86@gmail.com>
parents: 8
diff changeset
244
16
943aff89b068 client: add missing options to commit()
Idan Kamara <idankk86@gmail.com>
parents: 15
diff changeset
245 def commit(self, message=None, logfile=None, addremove=False, closebranch=False,
943aff89b068 client: add missing options to commit()
Idan Kamara <idankk86@gmail.com>
parents: 15
diff changeset
246 date=None, user=None, include=None, exclude=None):
943aff89b068 client: add missing options to commit()
Idan Kamara <idankk86@gmail.com>
parents: 15
diff changeset
247 if message is None and logfile is None:
943aff89b068 client: add missing options to commit()
Idan Kamara <idankk86@gmail.com>
parents: 15
diff changeset
248 raise ValueError("must provide at least a message or a logfile")
943aff89b068 client: add missing options to commit()
Idan Kamara <idankk86@gmail.com>
parents: 15
diff changeset
249 elif message and logfile:
943aff89b068 client: add missing options to commit()
Idan Kamara <idankk86@gmail.com>
parents: 15
diff changeset
250 raise ValueError("cannot specify both a message and a logfile")
943aff89b068 client: add missing options to commit()
Idan Kamara <idankk86@gmail.com>
parents: 15
diff changeset
251
14
e0d21c9db20b client: use --debug when committing to get the new node info
Idan Kamara <idankk86@gmail.com>
parents: 13
diff changeset
252 # --debug will print the committed cset
16
943aff89b068 client: add missing options to commit()
Idan Kamara <idankk86@gmail.com>
parents: 15
diff changeset
253 args = cmdbuilder('commit', debug=True, m=message, A=addremove,
943aff89b068 client: add missing options to commit()
Idan Kamara <idankk86@gmail.com>
parents: 15
diff changeset
254 close_branch=closebranch, d=date, u=user, l=logfile,
943aff89b068 client: add missing options to commit()
Idan Kamara <idankk86@gmail.com>
parents: 15
diff changeset
255 I=include, X=exclude)
10
fce3102c19e5 client: sort commands by name
Idan Kamara <idankk86@gmail.com>
parents: 8
diff changeset
256
14
e0d21c9db20b client: use --debug when committing to get the new node info
Idan Kamara <idankk86@gmail.com>
parents: 13
diff changeset
257 out = self.rawcommand(args)
e0d21c9db20b client: use --debug when committing to get the new node info
Idan Kamara <idankk86@gmail.com>
parents: 13
diff changeset
258 rev, node = out.splitlines()[-1].rsplit(':')
15
f1af31960414 client: change return value of commit() to (rev, node)
Idan Kamara <idankk86@gmail.com>
parents: 14
diff changeset
259 return int(rev.split()[-1]), node
2
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
260
21
ffef7df076e8 client: rewrite config()
Idan Kamara <idankk86@gmail.com>
parents: 20
diff changeset
261 def config(self, names=[], untrusted=False, showsource=False):
ffef7df076e8 client: rewrite config()
Idan Kamara <idankk86@gmail.com>
parents: 20
diff changeset
262 """
ffef7df076e8 client: rewrite config()
Idan Kamara <idankk86@gmail.com>
parents: 20
diff changeset
263 Return a list of (section, key, value) config settings from all hgrc files
2
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
264
21
ffef7df076e8 client: rewrite config()
Idan Kamara <idankk86@gmail.com>
parents: 20
diff changeset
265 When showsource is specified, return (source, section, key, value) where
ffef7df076e8 client: rewrite config()
Idan Kamara <idankk86@gmail.com>
parents: 20
diff changeset
266 source is of the form filename:[line]
ffef7df076e8 client: rewrite config()
Idan Kamara <idankk86@gmail.com>
parents: 20
diff changeset
267 """
ffef7df076e8 client: rewrite config()
Idan Kamara <idankk86@gmail.com>
parents: 20
diff changeset
268 def splitline(s):
ffef7df076e8 client: rewrite config()
Idan Kamara <idankk86@gmail.com>
parents: 20
diff changeset
269 k, value = s.rstrip().split('=', 1)
ffef7df076e8 client: rewrite config()
Idan Kamara <idankk86@gmail.com>
parents: 20
diff changeset
270 section, key = k.split('.', 1)
ffef7df076e8 client: rewrite config()
Idan Kamara <idankk86@gmail.com>
parents: 20
diff changeset
271 return (section, key, value)
ffef7df076e8 client: rewrite config()
Idan Kamara <idankk86@gmail.com>
parents: 20
diff changeset
272
ffef7df076e8 client: rewrite config()
Idan Kamara <idankk86@gmail.com>
parents: 20
diff changeset
273 if not isinstance(names, list):
ffef7df076e8 client: rewrite config()
Idan Kamara <idankk86@gmail.com>
parents: 20
diff changeset
274 names = [names]
2
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
275
21
ffef7df076e8 client: rewrite config()
Idan Kamara <idankk86@gmail.com>
parents: 20
diff changeset
276 args = cmdbuilder('showconfig', *names, u=untrusted, debug=showsource)
ffef7df076e8 client: rewrite config()
Idan Kamara <idankk86@gmail.com>
parents: 20
diff changeset
277 out = self.rawcommand(args)
2
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
278
21
ffef7df076e8 client: rewrite config()
Idan Kamara <idankk86@gmail.com>
parents: 20
diff changeset
279 conf = []
ffef7df076e8 client: rewrite config()
Idan Kamara <idankk86@gmail.com>
parents: 20
diff changeset
280 if showsource:
ffef7df076e8 client: rewrite config()
Idan Kamara <idankk86@gmail.com>
parents: 20
diff changeset
281 out = util.skiplines(out, 'read config from: ')
ffef7df076e8 client: rewrite config()
Idan Kamara <idankk86@gmail.com>
parents: 20
diff changeset
282 for line in out.splitlines():
ffef7df076e8 client: rewrite config()
Idan Kamara <idankk86@gmail.com>
parents: 20
diff changeset
283 m = re.match(r"(.+?:(?:\d+:)?) (.*)", line)
ffef7df076e8 client: rewrite config()
Idan Kamara <idankk86@gmail.com>
parents: 20
diff changeset
284 t = splitline(m.group(2))
ffef7df076e8 client: rewrite config()
Idan Kamara <idankk86@gmail.com>
parents: 20
diff changeset
285 conf.append((m.group(1)[:-1], t[0], t[1], t[2]))
ffef7df076e8 client: rewrite config()
Idan Kamara <idankk86@gmail.com>
parents: 20
diff changeset
286 else:
ffef7df076e8 client: rewrite config()
Idan Kamara <idankk86@gmail.com>
parents: 20
diff changeset
287 for line in out.splitlines():
ffef7df076e8 client: rewrite config()
Idan Kamara <idankk86@gmail.com>
parents: 20
diff changeset
288 conf.append(splitline(line))
ffef7df076e8 client: rewrite config()
Idan Kamara <idankk86@gmail.com>
parents: 20
diff changeset
289
ffef7df076e8 client: rewrite config()
Idan Kamara <idankk86@gmail.com>
parents: 20
diff changeset
290 return conf
2
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
291
10
fce3102c19e5 client: sort commands by name
Idan Kamara <idankk86@gmail.com>
parents: 8
diff changeset
292 @property
fce3102c19e5 client: sort commands by name
Idan Kamara <idankk86@gmail.com>
parents: 8
diff changeset
293 def encoding(self):
fce3102c19e5 client: sort commands by name
Idan Kamara <idankk86@gmail.com>
parents: 8
diff changeset
294 """ get the servers encoding """
fce3102c19e5 client: sort commands by name
Idan Kamara <idankk86@gmail.com>
parents: 8
diff changeset
295 if not 'getencoding' in self.capabilities:
fce3102c19e5 client: sort commands by name
Idan Kamara <idankk86@gmail.com>
parents: 8
diff changeset
296 raise CapabilityError('getencoding')
5
3182303f388d client: rawcommand, more convenient helper to run commands instead of outputruncommand
Idan Kamara <idankk86@gmail.com>
parents: 4
diff changeset
297
10
fce3102c19e5 client: sort commands by name
Idan Kamara <idankk86@gmail.com>
parents: 8
diff changeset
298 if not self._encoding:
fce3102c19e5 client: sort commands by name
Idan Kamara <idankk86@gmail.com>
parents: 8
diff changeset
299 self.server.stdin.write('getencoding\n')
fce3102c19e5 client: sort commands by name
Idan Kamara <idankk86@gmail.com>
parents: 8
diff changeset
300 self._encoding = self._readfromchannel('r')
5
3182303f388d client: rawcommand, more convenient helper to run commands instead of outputruncommand
Idan Kamara <idankk86@gmail.com>
parents: 4
diff changeset
301
10
fce3102c19e5 client: sort commands by name
Idan Kamara <idankk86@gmail.com>
parents: 8
diff changeset
302 return self._encoding
2
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
303
29
c072f525ea3e client: add copy command
Idan Kamara <idankk86@gmail.com>
parents: 28
diff changeset
304 def copy(self, source, dest, after=False, force=False, dryrun=False,
c072f525ea3e client: add copy command
Idan Kamara <idankk86@gmail.com>
parents: 28
diff changeset
305 include=None, exclude=None):
c072f525ea3e client: add copy command
Idan Kamara <idankk86@gmail.com>
parents: 28
diff changeset
306 if not isinstance(source, list):
c072f525ea3e client: add copy command
Idan Kamara <idankk86@gmail.com>
parents: 28
diff changeset
307 source = [source]
c072f525ea3e client: add copy command
Idan Kamara <idankk86@gmail.com>
parents: 28
diff changeset
308
c072f525ea3e client: add copy command
Idan Kamara <idankk86@gmail.com>
parents: 28
diff changeset
309 source.append(dest)
c072f525ea3e client: add copy command
Idan Kamara <idankk86@gmail.com>
parents: 28
diff changeset
310 args = cmdbuilder('copy', *source, A=after, f=force, n=dryrun,
c072f525ea3e client: add copy command
Idan Kamara <idankk86@gmail.com>
parents: 28
diff changeset
311 I=include, X=exclude)
c072f525ea3e client: add copy command
Idan Kamara <idankk86@gmail.com>
parents: 28
diff changeset
312
c072f525ea3e client: add copy command
Idan Kamara <idankk86@gmail.com>
parents: 28
diff changeset
313 # we could use Python 3 nonlocal here...
c072f525ea3e client: add copy command
Idan Kamara <idankk86@gmail.com>
parents: 28
diff changeset
314 warnings = [False]
c072f525ea3e client: add copy command
Idan Kamara <idankk86@gmail.com>
parents: 28
diff changeset
315
c072f525ea3e client: add copy command
Idan Kamara <idankk86@gmail.com>
parents: 28
diff changeset
316 def eh(ret, out, err):
c072f525ea3e client: add copy command
Idan Kamara <idankk86@gmail.com>
parents: 28
diff changeset
317 if ret == 1:
c072f525ea3e client: add copy command
Idan Kamara <idankk86@gmail.com>
parents: 28
diff changeset
318 warnings[0] = True
c072f525ea3e client: add copy command
Idan Kamara <idankk86@gmail.com>
parents: 28
diff changeset
319 else:
c072f525ea3e client: add copy command
Idan Kamara <idankk86@gmail.com>
parents: 28
diff changeset
320 raise error.CommandError(args, ret, out, err)
c072f525ea3e client: add copy command
Idan Kamara <idankk86@gmail.com>
parents: 28
diff changeset
321
c072f525ea3e client: add copy command
Idan Kamara <idankk86@gmail.com>
parents: 28
diff changeset
322 self.rawcommand(args, eh=eh)
c072f525ea3e client: add copy command
Idan Kamara <idankk86@gmail.com>
parents: 28
diff changeset
323 return not warnings[0]
c072f525ea3e client: add copy command
Idan Kamara <idankk86@gmail.com>
parents: 28
diff changeset
324
31
ee8863882aae client: add forget command
Idan Kamara <idankk86@gmail.com>
parents: 30
diff changeset
325 def forget(self, files, include=None, exclude=None):
ee8863882aae client: add forget command
Idan Kamara <idankk86@gmail.com>
parents: 30
diff changeset
326 if not isinstance(files, list):
ee8863882aae client: add forget command
Idan Kamara <idankk86@gmail.com>
parents: 30
diff changeset
327 files = [files]
ee8863882aae client: add forget command
Idan Kamara <idankk86@gmail.com>
parents: 30
diff changeset
328
ee8863882aae client: add forget command
Idan Kamara <idankk86@gmail.com>
parents: 30
diff changeset
329 args = cmdbuilder('forget', *files, I=include, X=exclude)
ee8863882aae client: add forget command
Idan Kamara <idankk86@gmail.com>
parents: 30
diff changeset
330
ee8863882aae client: add forget command
Idan Kamara <idankk86@gmail.com>
parents: 30
diff changeset
331 # we could use Python 3 nonlocal here...
ee8863882aae client: add forget command
Idan Kamara <idankk86@gmail.com>
parents: 30
diff changeset
332 warnings = [False]
ee8863882aae client: add forget command
Idan Kamara <idankk86@gmail.com>
parents: 30
diff changeset
333
ee8863882aae client: add forget command
Idan Kamara <idankk86@gmail.com>
parents: 30
diff changeset
334 def eh(ret, out, err):
ee8863882aae client: add forget command
Idan Kamara <idankk86@gmail.com>
parents: 30
diff changeset
335 if ret == 1:
ee8863882aae client: add forget command
Idan Kamara <idankk86@gmail.com>
parents: 30
diff changeset
336 warnings[0] = True
ee8863882aae client: add forget command
Idan Kamara <idankk86@gmail.com>
parents: 30
diff changeset
337 else:
ee8863882aae client: add forget command
Idan Kamara <idankk86@gmail.com>
parents: 30
diff changeset
338 raise error.CommandError(args, ret, out, err)
ee8863882aae client: add forget command
Idan Kamara <idankk86@gmail.com>
parents: 30
diff changeset
339
ee8863882aae client: add forget command
Idan Kamara <idankk86@gmail.com>
parents: 30
diff changeset
340 out = self.rawcommand(args, eh=eh)
ee8863882aae client: add forget command
Idan Kamara <idankk86@gmail.com>
parents: 30
diff changeset
341 return not warnings[0]
ee8863882aae client: add forget command
Idan Kamara <idankk86@gmail.com>
parents: 30
diff changeset
342
13
400cb1520834 client: add missing options to import_()
Idan Kamara <idankk86@gmail.com>
parents: 12
diff changeset
343 def import_(self, patches, strip=None, force=False, nocommit=False,
400cb1520834 client: add missing options to import_()
Idan Kamara <idankk86@gmail.com>
parents: 12
diff changeset
344 bypass=False, exact=False, importbranch=False, message=None,
400cb1520834 client: add missing options to import_()
Idan Kamara <idankk86@gmail.com>
parents: 12
diff changeset
345 date=None, user=None, similarity=None):
400cb1520834 client: add missing options to import_()
Idan Kamara <idankk86@gmail.com>
parents: 12
diff changeset
346 """
400cb1520834 client: add missing options to import_()
Idan Kamara <idankk86@gmail.com>
parents: 12
diff changeset
347 patches can be a list of file names with patches to apply
400cb1520834 client: add missing options to import_()
Idan Kamara <idankk86@gmail.com>
parents: 12
diff changeset
348 or a file-like object that contains a patch (needs read and readline)
400cb1520834 client: add missing options to import_()
Idan Kamara <idankk86@gmail.com>
parents: 12
diff changeset
349 """
400cb1520834 client: add missing options to import_()
Idan Kamara <idankk86@gmail.com>
parents: 12
diff changeset
350 if hasattr(patches, 'read') and hasattr(patches, 'readline'):
400cb1520834 client: add missing options to import_()
Idan Kamara <idankk86@gmail.com>
parents: 12
diff changeset
351 patch = patches
2
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
352
13
400cb1520834 client: add missing options to import_()
Idan Kamara <idankk86@gmail.com>
parents: 12
diff changeset
353 def readline(size, output):
400cb1520834 client: add missing options to import_()
Idan Kamara <idankk86@gmail.com>
parents: 12
diff changeset
354 return patch.readline(size)
2
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
355
13
400cb1520834 client: add missing options to import_()
Idan Kamara <idankk86@gmail.com>
parents: 12
diff changeset
356 stdin = True
400cb1520834 client: add missing options to import_()
Idan Kamara <idankk86@gmail.com>
parents: 12
diff changeset
357 patches = ()
400cb1520834 client: add missing options to import_()
Idan Kamara <idankk86@gmail.com>
parents: 12
diff changeset
358 prompt = readline
400cb1520834 client: add missing options to import_()
Idan Kamara <idankk86@gmail.com>
parents: 12
diff changeset
359 input = patch.read
400cb1520834 client: add missing options to import_()
Idan Kamara <idankk86@gmail.com>
parents: 12
diff changeset
360 else:
400cb1520834 client: add missing options to import_()
Idan Kamara <idankk86@gmail.com>
parents: 12
diff changeset
361 stdin = False
400cb1520834 client: add missing options to import_()
Idan Kamara <idankk86@gmail.com>
parents: 12
diff changeset
362 prompt = None
400cb1520834 client: add missing options to import_()
Idan Kamara <idankk86@gmail.com>
parents: 12
diff changeset
363 input = None
5
3182303f388d client: rawcommand, more convenient helper to run commands instead of outputruncommand
Idan Kamara <idankk86@gmail.com>
parents: 4
diff changeset
364
13
400cb1520834 client: add missing options to import_()
Idan Kamara <idankk86@gmail.com>
parents: 12
diff changeset
365 args = cmdbuilder('import', *patches, strip=strip, force=force,
400cb1520834 client: add missing options to import_()
Idan Kamara <idankk86@gmail.com>
parents: 12
diff changeset
366 nocommit=nocommit, bypass=bypass, exact=exact,
400cb1520834 client: add missing options to import_()
Idan Kamara <idankk86@gmail.com>
parents: 12
diff changeset
367 importbranch=importbranch, message=message,
400cb1520834 client: add missing options to import_()
Idan Kamara <idankk86@gmail.com>
parents: 12
diff changeset
368 date=date, user=user, similarity=similarity, _=stdin)
400cb1520834 client: add missing options to import_()
Idan Kamara <idankk86@gmail.com>
parents: 12
diff changeset
369
400cb1520834 client: add missing options to import_()
Idan Kamara <idankk86@gmail.com>
parents: 12
diff changeset
370 self.rawcommand(args, prompt=prompt, input=input)
2
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
371
25
85ae94b98324 client: add missing options to incoming
Idan Kamara <idankk86@gmail.com>
parents: 24
diff changeset
372 def incoming(self, revrange=None, path=None, force=False, newest=False,
85ae94b98324 client: add missing options to incoming
Idan Kamara <idankk86@gmail.com>
parents: 24
diff changeset
373 bundle=None, bookmarks=False, branch=None, limit=None,
85ae94b98324 client: add missing options to incoming
Idan Kamara <idankk86@gmail.com>
parents: 24
diff changeset
374 nomerges=False, subrepos=False):
27
46908f4b87d5 client: add bookmarks support to incoming and outgoing
Idan Kamara <idankk86@gmail.com>
parents: 26
diff changeset
375 """
46908f4b87d5 client: add bookmarks support to incoming and outgoing
Idan Kamara <idankk86@gmail.com>
parents: 26
diff changeset
376 Return new changesets found in the specified path or the default pull
46908f4b87d5 client: add bookmarks support to incoming and outgoing
Idan Kamara <idankk86@gmail.com>
parents: 26
diff changeset
377 location.
46908f4b87d5 client: add bookmarks support to incoming and outgoing
Idan Kamara <idankk86@gmail.com>
parents: 26
diff changeset
378
46908f4b87d5 client: add bookmarks support to incoming and outgoing
Idan Kamara <idankk86@gmail.com>
parents: 26
diff changeset
379 When bookmarks=True, return a list of (name, node) of incoming bookmarks.
46908f4b87d5 client: add bookmarks support to incoming and outgoing
Idan Kamara <idankk86@gmail.com>
parents: 26
diff changeset
380 """
10
fce3102c19e5 client: sort commands by name
Idan Kamara <idankk86@gmail.com>
parents: 8
diff changeset
381 args = cmdbuilder('incoming',
fce3102c19e5 client: sort commands by name
Idan Kamara <idankk86@gmail.com>
parents: 8
diff changeset
382 path,
25
85ae94b98324 client: add missing options to incoming
Idan Kamara <idankk86@gmail.com>
parents: 24
diff changeset
383 template=templates.changeset, r=revrange,
85ae94b98324 client: add missing options to incoming
Idan Kamara <idankk86@gmail.com>
parents: 24
diff changeset
384 f=force, n=newest, bundle=bundle,
85ae94b98324 client: add missing options to incoming
Idan Kamara <idankk86@gmail.com>
parents: 24
diff changeset
385 B=bookmarks, b=branch, l=limit, M=nomerges, S=subrepos)
10
fce3102c19e5 client: sort commands by name
Idan Kamara <idankk86@gmail.com>
parents: 8
diff changeset
386
fce3102c19e5 client: sort commands by name
Idan Kamara <idankk86@gmail.com>
parents: 8
diff changeset
387 def eh(ret, out, err):
fce3102c19e5 client: sort commands by name
Idan Kamara <idankk86@gmail.com>
parents: 8
diff changeset
388 if ret != 1:
fce3102c19e5 client: sort commands by name
Idan Kamara <idankk86@gmail.com>
parents: 8
diff changeset
389 raise error.CommandError(args, ret, out, err)
2
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
390
10
fce3102c19e5 client: sort commands by name
Idan Kamara <idankk86@gmail.com>
parents: 8
diff changeset
391 out = self.rawcommand(args, eh=eh)
fce3102c19e5 client: sort commands by name
Idan Kamara <idankk86@gmail.com>
parents: 8
diff changeset
392 if not out:
fce3102c19e5 client: sort commands by name
Idan Kamara <idankk86@gmail.com>
parents: 8
diff changeset
393 return []
2
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
394
27
46908f4b87d5 client: add bookmarks support to incoming and outgoing
Idan Kamara <idankk86@gmail.com>
parents: 26
diff changeset
395 out = util.eatlines(out, 2)
46908f4b87d5 client: add bookmarks support to incoming and outgoing
Idan Kamara <idankk86@gmail.com>
parents: 26
diff changeset
396 if bookmarks:
46908f4b87d5 client: add bookmarks support to incoming and outgoing
Idan Kamara <idankk86@gmail.com>
parents: 26
diff changeset
397 bms = []
46908f4b87d5 client: add bookmarks support to incoming and outgoing
Idan Kamara <idankk86@gmail.com>
parents: 26
diff changeset
398 for line in out.splitlines():
46908f4b87d5 client: add bookmarks support to incoming and outgoing
Idan Kamara <idankk86@gmail.com>
parents: 26
diff changeset
399 bms.append(tuple(line.split()))
46908f4b87d5 client: add bookmarks support to incoming and outgoing
Idan Kamara <idankk86@gmail.com>
parents: 26
diff changeset
400 return bms
46908f4b87d5 client: add bookmarks support to incoming and outgoing
Idan Kamara <idankk86@gmail.com>
parents: 26
diff changeset
401 else:
46908f4b87d5 client: add bookmarks support to incoming and outgoing
Idan Kamara <idankk86@gmail.com>
parents: 26
diff changeset
402 out = out.split('\0')[:-1]
46908f4b87d5 client: add bookmarks support to incoming and outgoing
Idan Kamara <idankk86@gmail.com>
parents: 26
diff changeset
403 return self._parserevs(out)
10
fce3102c19e5 client: sort commands by name
Idan Kamara <idankk86@gmail.com>
parents: 8
diff changeset
404
17
b68c444d42bb client: add missing options to log()
Idan Kamara <idankk86@gmail.com>
parents: 16
diff changeset
405 def log(self, revrange=None, files=[], follow=False, followfirst=False,
b68c444d42bb client: add missing options to log()
Idan Kamara <idankk86@gmail.com>
parents: 16
diff changeset
406 date=None, copies=False, keyword=None, removed=False, onlymerges=False,
b68c444d42bb client: add missing options to log()
Idan Kamara <idankk86@gmail.com>
parents: 16
diff changeset
407 user=None, branch=None, prune=None, hidden=False, limit=None,
b68c444d42bb client: add missing options to log()
Idan Kamara <idankk86@gmail.com>
parents: 16
diff changeset
408 nomerges=False, include=None, exclude=None):
b68c444d42bb client: add missing options to log()
Idan Kamara <idankk86@gmail.com>
parents: 16
diff changeset
409 args = cmdbuilder('log', *files, template=templates.changeset,
b68c444d42bb client: add missing options to log()
Idan Kamara <idankk86@gmail.com>
parents: 16
diff changeset
410 r=revrange, f=follow, follow_first=followfirst,
b68c444d42bb client: add missing options to log()
Idan Kamara <idankk86@gmail.com>
parents: 16
diff changeset
411 d=date, C=copies, k=keyword, removed=removed,
b68c444d42bb client: add missing options to log()
Idan Kamara <idankk86@gmail.com>
parents: 16
diff changeset
412 m=onlymerges, u=user, b=branch, P=prune, h=hidden,
b68c444d42bb client: add missing options to log()
Idan Kamara <idankk86@gmail.com>
parents: 16
diff changeset
413 l=limit, M=nomerges, I=include, X=exclude)
2
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
414
10
fce3102c19e5 client: sort commands by name
Idan Kamara <idankk86@gmail.com>
parents: 8
diff changeset
415 out = self.rawcommand(args)
fce3102c19e5 client: sort commands by name
Idan Kamara <idankk86@gmail.com>
parents: 8
diff changeset
416 out = out.split('\0')[:-1]
2
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
417
10
fce3102c19e5 client: sort commands by name
Idan Kamara <idankk86@gmail.com>
parents: 8
diff changeset
418 return self._parserevs(out)
fce3102c19e5 client: sort commands by name
Idan Kamara <idankk86@gmail.com>
parents: 8
diff changeset
419
32
a2fc0a7f648e client: add move command
Idan Kamara <idankk86@gmail.com>
parents: 31
diff changeset
420 def move(self, source, dest, after=False, force=False, dryrun=False,
a2fc0a7f648e client: add move command
Idan Kamara <idankk86@gmail.com>
parents: 31
diff changeset
421 include=None, exclude=None):
a2fc0a7f648e client: add move command
Idan Kamara <idankk86@gmail.com>
parents: 31
diff changeset
422 if not isinstance(source, list):
a2fc0a7f648e client: add move command
Idan Kamara <idankk86@gmail.com>
parents: 31
diff changeset
423 source = [source]
a2fc0a7f648e client: add move command
Idan Kamara <idankk86@gmail.com>
parents: 31
diff changeset
424
a2fc0a7f648e client: add move command
Idan Kamara <idankk86@gmail.com>
parents: 31
diff changeset
425 source.append(dest)
a2fc0a7f648e client: add move command
Idan Kamara <idankk86@gmail.com>
parents: 31
diff changeset
426 args = cmdbuilder('move', *source, A=after, f=force, n=dryrun,
a2fc0a7f648e client: add move command
Idan Kamara <idankk86@gmail.com>
parents: 31
diff changeset
427 I=include, X=exclude)
a2fc0a7f648e client: add move command
Idan Kamara <idankk86@gmail.com>
parents: 31
diff changeset
428
a2fc0a7f648e client: add move command
Idan Kamara <idankk86@gmail.com>
parents: 31
diff changeset
429 # we could use Python 3 nonlocal here...
a2fc0a7f648e client: add move command
Idan Kamara <idankk86@gmail.com>
parents: 31
diff changeset
430 warnings = [False]
a2fc0a7f648e client: add move command
Idan Kamara <idankk86@gmail.com>
parents: 31
diff changeset
431
a2fc0a7f648e client: add move command
Idan Kamara <idankk86@gmail.com>
parents: 31
diff changeset
432 def eh(ret, out, err):
a2fc0a7f648e client: add move command
Idan Kamara <idankk86@gmail.com>
parents: 31
diff changeset
433 if ret == 1:
a2fc0a7f648e client: add move command
Idan Kamara <idankk86@gmail.com>
parents: 31
diff changeset
434 warnings[0] = True
a2fc0a7f648e client: add move command
Idan Kamara <idankk86@gmail.com>
parents: 31
diff changeset
435 else:
a2fc0a7f648e client: add move command
Idan Kamara <idankk86@gmail.com>
parents: 31
diff changeset
436 raise error.CommandError(args, ret, out, err)
a2fc0a7f648e client: add move command
Idan Kamara <idankk86@gmail.com>
parents: 31
diff changeset
437
a2fc0a7f648e client: add move command
Idan Kamara <idankk86@gmail.com>
parents: 31
diff changeset
438 self.rawcommand(args, eh=eh)
a2fc0a7f648e client: add move command
Idan Kamara <idankk86@gmail.com>
parents: 31
diff changeset
439 return not warnings[0]
a2fc0a7f648e client: add move command
Idan Kamara <idankk86@gmail.com>
parents: 31
diff changeset
440
26
b4e5c8745ef3 client: add missing options to outgoing
Idan Kamara <idankk86@gmail.com>
parents: 25
diff changeset
441 def outgoing(self, revrange=None, path=None, force=False, newest=False,
b4e5c8745ef3 client: add missing options to outgoing
Idan Kamara <idankk86@gmail.com>
parents: 25
diff changeset
442 bookmarks=False, branch=None, limit=None, nomerges=False,
b4e5c8745ef3 client: add missing options to outgoing
Idan Kamara <idankk86@gmail.com>
parents: 25
diff changeset
443 subrepos=False):
27
46908f4b87d5 client: add bookmarks support to incoming and outgoing
Idan Kamara <idankk86@gmail.com>
parents: 26
diff changeset
444 """
46908f4b87d5 client: add bookmarks support to incoming and outgoing
Idan Kamara <idankk86@gmail.com>
parents: 26
diff changeset
445 Return changesets not found in the specified path or the default push
46908f4b87d5 client: add bookmarks support to incoming and outgoing
Idan Kamara <idankk86@gmail.com>
parents: 26
diff changeset
446 location.
46908f4b87d5 client: add bookmarks support to incoming and outgoing
Idan Kamara <idankk86@gmail.com>
parents: 26
diff changeset
447
46908f4b87d5 client: add bookmarks support to incoming and outgoing
Idan Kamara <idankk86@gmail.com>
parents: 26
diff changeset
448 When bookmarks=True, return a list of (name, node) of bookmarks that will
46908f4b87d5 client: add bookmarks support to incoming and outgoing
Idan Kamara <idankk86@gmail.com>
parents: 26
diff changeset
449 be pushed.
46908f4b87d5 client: add bookmarks support to incoming and outgoing
Idan Kamara <idankk86@gmail.com>
parents: 26
diff changeset
450 """
10
fce3102c19e5 client: sort commands by name
Idan Kamara <idankk86@gmail.com>
parents: 8
diff changeset
451 args = cmdbuilder('outgoing',
26
b4e5c8745ef3 client: add missing options to outgoing
Idan Kamara <idankk86@gmail.com>
parents: 25
diff changeset
452 path,
b4e5c8745ef3 client: add missing options to outgoing
Idan Kamara <idankk86@gmail.com>
parents: 25
diff changeset
453 template=templates.changeset, r=revrange,
b4e5c8745ef3 client: add missing options to outgoing
Idan Kamara <idankk86@gmail.com>
parents: 25
diff changeset
454 f=force, n=newest, B=bookmarks,
b4e5c8745ef3 client: add missing options to outgoing
Idan Kamara <idankk86@gmail.com>
parents: 25
diff changeset
455 b=branch, S=subrepos)
2
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
456
10
fce3102c19e5 client: sort commands by name
Idan Kamara <idankk86@gmail.com>
parents: 8
diff changeset
457 def eh(ret, out, err):
fce3102c19e5 client: sort commands by name
Idan Kamara <idankk86@gmail.com>
parents: 8
diff changeset
458 if ret != 1:
fce3102c19e5 client: sort commands by name
Idan Kamara <idankk86@gmail.com>
parents: 8
diff changeset
459 raise error.CommandError(args, ret, out, err)
2
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
460
10
fce3102c19e5 client: sort commands by name
Idan Kamara <idankk86@gmail.com>
parents: 8
diff changeset
461 out = self.rawcommand(args, eh=eh)
fce3102c19e5 client: sort commands by name
Idan Kamara <idankk86@gmail.com>
parents: 8
diff changeset
462 if not out:
fce3102c19e5 client: sort commands by name
Idan Kamara <idankk86@gmail.com>
parents: 8
diff changeset
463 return []
fce3102c19e5 client: sort commands by name
Idan Kamara <idankk86@gmail.com>
parents: 8
diff changeset
464
27
46908f4b87d5 client: add bookmarks support to incoming and outgoing
Idan Kamara <idankk86@gmail.com>
parents: 26
diff changeset
465 out = util.eatlines(out, 2)
46908f4b87d5 client: add bookmarks support to incoming and outgoing
Idan Kamara <idankk86@gmail.com>
parents: 26
diff changeset
466 if bookmarks:
46908f4b87d5 client: add bookmarks support to incoming and outgoing
Idan Kamara <idankk86@gmail.com>
parents: 26
diff changeset
467 bms = []
46908f4b87d5 client: add bookmarks support to incoming and outgoing
Idan Kamara <idankk86@gmail.com>
parents: 26
diff changeset
468 for line in out.splitlines():
46908f4b87d5 client: add bookmarks support to incoming and outgoing
Idan Kamara <idankk86@gmail.com>
parents: 26
diff changeset
469 bms.append(tuple(line.split()))
46908f4b87d5 client: add bookmarks support to incoming and outgoing
Idan Kamara <idankk86@gmail.com>
parents: 26
diff changeset
470 return bms
46908f4b87d5 client: add bookmarks support to incoming and outgoing
Idan Kamara <idankk86@gmail.com>
parents: 26
diff changeset
471 else:
46908f4b87d5 client: add bookmarks support to incoming and outgoing
Idan Kamara <idankk86@gmail.com>
parents: 26
diff changeset
472 out = out.split('\0')[:-1]
46908f4b87d5 client: add bookmarks support to incoming and outgoing
Idan Kamara <idankk86@gmail.com>
parents: 26
diff changeset
473 return self._parserevs(out)
2
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
474
18
518149e32888 client: add parents command
Idan Kamara <idankk86@gmail.com>
parents: 17
diff changeset
475 def parents(self, rev=None, file=None):
518149e32888 client: add parents command
Idan Kamara <idankk86@gmail.com>
parents: 17
diff changeset
476 args = cmdbuilder('parents', file, template=templates.changeset, r=rev)
518149e32888 client: add parents command
Idan Kamara <idankk86@gmail.com>
parents: 17
diff changeset
477
518149e32888 client: add parents command
Idan Kamara <idankk86@gmail.com>
parents: 17
diff changeset
478 out = self.rawcommand(args)
518149e32888 client: add parents command
Idan Kamara <idankk86@gmail.com>
parents: 17
diff changeset
479 if not out:
518149e32888 client: add parents command
Idan Kamara <idankk86@gmail.com>
parents: 17
diff changeset
480 return
518149e32888 client: add parents command
Idan Kamara <idankk86@gmail.com>
parents: 17
diff changeset
481
518149e32888 client: add parents command
Idan Kamara <idankk86@gmail.com>
parents: 17
diff changeset
482 out = out.split('\0')[:-1]
518149e32888 client: add parents command
Idan Kamara <idankk86@gmail.com>
parents: 17
diff changeset
483
518149e32888 client: add parents command
Idan Kamara <idankk86@gmail.com>
parents: 17
diff changeset
484 return self._parserevs(out)
518149e32888 client: add parents command
Idan Kamara <idankk86@gmail.com>
parents: 17
diff changeset
485
2
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
486 def paths(self, name=None):
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
487 if not name:
5
3182303f388d client: rawcommand, more convenient helper to run commands instead of outputruncommand
Idan Kamara <idankk86@gmail.com>
parents: 4
diff changeset
488 out = self.rawcommand(['paths'])
2
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
489 if not out:
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
490 return {}
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
491
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
492 return dict([s.split(' = ') for s in out.rstrip().split('\n')])
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
493 else:
4
a3a9cf58801f client: use the cmdbuilder
Idan Kamara <idankk86@gmail.com>
parents: 2
diff changeset
494 args = cmdbuilder('paths', name)
5
3182303f388d client: rawcommand, more convenient helper to run commands instead of outputruncommand
Idan Kamara <idankk86@gmail.com>
parents: 4
diff changeset
495 out = self.rawcommand(args)
2
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
496 return out.rstrip()
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
497
30
b7042bb3dbfd client: add remove command
Idan Kamara <idankk86@gmail.com>
parents: 29
diff changeset
498 def remove(self, files, after=False, force=False, include=None, exclude=None):
b7042bb3dbfd client: add remove command
Idan Kamara <idankk86@gmail.com>
parents: 29
diff changeset
499 if not isinstance(files, list):
b7042bb3dbfd client: add remove command
Idan Kamara <idankk86@gmail.com>
parents: 29
diff changeset
500 files = [files]
b7042bb3dbfd client: add remove command
Idan Kamara <idankk86@gmail.com>
parents: 29
diff changeset
501
b7042bb3dbfd client: add remove command
Idan Kamara <idankk86@gmail.com>
parents: 29
diff changeset
502 args = cmdbuilder('remove', *files, A=after, f=force, I=include, X=exclude)
b7042bb3dbfd client: add remove command
Idan Kamara <idankk86@gmail.com>
parents: 29
diff changeset
503
b7042bb3dbfd client: add remove command
Idan Kamara <idankk86@gmail.com>
parents: 29
diff changeset
504 # we could use Python 3 nonlocal here...
b7042bb3dbfd client: add remove command
Idan Kamara <idankk86@gmail.com>
parents: 29
diff changeset
505 warnings = [False]
b7042bb3dbfd client: add remove command
Idan Kamara <idankk86@gmail.com>
parents: 29
diff changeset
506
b7042bb3dbfd client: add remove command
Idan Kamara <idankk86@gmail.com>
parents: 29
diff changeset
507 def eh(ret, out, err):
b7042bb3dbfd client: add remove command
Idan Kamara <idankk86@gmail.com>
parents: 29
diff changeset
508 if ret == 1:
b7042bb3dbfd client: add remove command
Idan Kamara <idankk86@gmail.com>
parents: 29
diff changeset
509 warnings[0] = True
b7042bb3dbfd client: add remove command
Idan Kamara <idankk86@gmail.com>
parents: 29
diff changeset
510 else:
b7042bb3dbfd client: add remove command
Idan Kamara <idankk86@gmail.com>
parents: 29
diff changeset
511 raise error.CommandError(args, ret, out, err)
b7042bb3dbfd client: add remove command
Idan Kamara <idankk86@gmail.com>
parents: 29
diff changeset
512
b7042bb3dbfd client: add remove command
Idan Kamara <idankk86@gmail.com>
parents: 29
diff changeset
513 out = self.rawcommand(args, eh=eh)
b7042bb3dbfd client: add remove command
Idan Kamara <idankk86@gmail.com>
parents: 29
diff changeset
514 return not warnings[0]
b7042bb3dbfd client: add remove command
Idan Kamara <idankk86@gmail.com>
parents: 29
diff changeset
515
10
fce3102c19e5 client: sort commands by name
Idan Kamara <idankk86@gmail.com>
parents: 8
diff changeset
516 def root(self):
fce3102c19e5 client: sort commands by name
Idan Kamara <idankk86@gmail.com>
parents: 8
diff changeset
517 return self.rawcommand(['root']).rstrip()
fce3102c19e5 client: sort commands by name
Idan Kamara <idankk86@gmail.com>
parents: 8
diff changeset
518
33
d74a5891d9d1 client: add missing options to status
Idan Kamara <idankk86@gmail.com>
parents: 32
diff changeset
519 def status(self, rev=None, change=None, all=False, modified=False, added=False,
d74a5891d9d1 client: add missing options to status
Idan Kamara <idankk86@gmail.com>
parents: 32
diff changeset
520 removed=False, deleted=False, clean=False, unknown=False,
d74a5891d9d1 client: add missing options to status
Idan Kamara <idankk86@gmail.com>
parents: 32
diff changeset
521 ignored=False, copies=False, subrepos=False, include=None,
d74a5891d9d1 client: add missing options to status
Idan Kamara <idankk86@gmail.com>
parents: 32
diff changeset
522 exclude=None):
d74a5891d9d1 client: add missing options to status
Idan Kamara <idankk86@gmail.com>
parents: 32
diff changeset
523 """
34
f6e1d9a6e0cd client: change return value of status() to a list of (code, file path)
Idan Kamara <idankk86@gmail.com>
parents: 33
diff changeset
524 Return a list of (code, file path) where code can be:
10
fce3102c19e5 client: sort commands by name
Idan Kamara <idankk86@gmail.com>
parents: 8
diff changeset
525
33
d74a5891d9d1 client: add missing options to status
Idan Kamara <idankk86@gmail.com>
parents: 32
diff changeset
526 M = modified
d74a5891d9d1 client: add missing options to status
Idan Kamara <idankk86@gmail.com>
parents: 32
diff changeset
527 A = added
d74a5891d9d1 client: add missing options to status
Idan Kamara <idankk86@gmail.com>
parents: 32
diff changeset
528 R = removed
d74a5891d9d1 client: add missing options to status
Idan Kamara <idankk86@gmail.com>
parents: 32
diff changeset
529 C = clean
d74a5891d9d1 client: add missing options to status
Idan Kamara <idankk86@gmail.com>
parents: 32
diff changeset
530 ! = missing (deleted by non-hg command, but still tracked)
d74a5891d9d1 client: add missing options to status
Idan Kamara <idankk86@gmail.com>
parents: 32
diff changeset
531 ? = untracked
d74a5891d9d1 client: add missing options to status
Idan Kamara <idankk86@gmail.com>
parents: 32
diff changeset
532 I = ignored
d74a5891d9d1 client: add missing options to status
Idan Kamara <idankk86@gmail.com>
parents: 32
diff changeset
533 = origin of the previous file listed as A (added)
d74a5891d9d1 client: add missing options to status
Idan Kamara <idankk86@gmail.com>
parents: 32
diff changeset
534 """
d74a5891d9d1 client: add missing options to status
Idan Kamara <idankk86@gmail.com>
parents: 32
diff changeset
535 if rev and change:
d74a5891d9d1 client: add missing options to status
Idan Kamara <idankk86@gmail.com>
parents: 32
diff changeset
536 raise ValueError('cannot specify both rev and change')
d74a5891d9d1 client: add missing options to status
Idan Kamara <idankk86@gmail.com>
parents: 32
diff changeset
537
d74a5891d9d1 client: add missing options to status
Idan Kamara <idankk86@gmail.com>
parents: 32
diff changeset
538 args = cmdbuilder('status', rev=rev, change=change, A=all, m=modified,
d74a5891d9d1 client: add missing options to status
Idan Kamara <idankk86@gmail.com>
parents: 32
diff changeset
539 a=added, r=removed, d=deleted, c=clean, u=unknown,
d74a5891d9d1 client: add missing options to status
Idan Kamara <idankk86@gmail.com>
parents: 32
diff changeset
540 i=ignored, C=copies, S=subrepos, I=include, X=exclude)
d74a5891d9d1 client: add missing options to status
Idan Kamara <idankk86@gmail.com>
parents: 32
diff changeset
541
d74a5891d9d1 client: add missing options to status
Idan Kamara <idankk86@gmail.com>
parents: 32
diff changeset
542 args.append('-0')
d74a5891d9d1 client: add missing options to status
Idan Kamara <idankk86@gmail.com>
parents: 32
diff changeset
543
d74a5891d9d1 client: add missing options to status
Idan Kamara <idankk86@gmail.com>
parents: 32
diff changeset
544 out = self.rawcommand(args)
34
f6e1d9a6e0cd client: change return value of status() to a list of (code, file path)
Idan Kamara <idankk86@gmail.com>
parents: 33
diff changeset
545 l = []
10
fce3102c19e5 client: sort commands by name
Idan Kamara <idankk86@gmail.com>
parents: 8
diff changeset
546
fce3102c19e5 client: sort commands by name
Idan Kamara <idankk86@gmail.com>
parents: 8
diff changeset
547 for entry in out.split('\0'):
fce3102c19e5 client: sort commands by name
Idan Kamara <idankk86@gmail.com>
parents: 8
diff changeset
548 if entry:
35
1e33bbea23e5 client: handle spaces correctly in status()
Idan Kamara <idankk86@gmail.com>
parents: 34
diff changeset
549 if entry[0] == ' ':
1e33bbea23e5 client: handle spaces correctly in status()
Idan Kamara <idankk86@gmail.com>
parents: 34
diff changeset
550 l.append((' ', entry[2:]))
1e33bbea23e5 client: handle spaces correctly in status()
Idan Kamara <idankk86@gmail.com>
parents: 34
diff changeset
551 else:
1e33bbea23e5 client: handle spaces correctly in status()
Idan Kamara <idankk86@gmail.com>
parents: 34
diff changeset
552 l.append(tuple(entry.split(' ', 1)))
10
fce3102c19e5 client: sort commands by name
Idan Kamara <idankk86@gmail.com>
parents: 8
diff changeset
553
34
f6e1d9a6e0cd client: change return value of status() to a list of (code, file path)
Idan Kamara <idankk86@gmail.com>
parents: 33
diff changeset
554 return l
10
fce3102c19e5 client: sort commands by name
Idan Kamara <idankk86@gmail.com>
parents: 8
diff changeset
555
fce3102c19e5 client: sort commands by name
Idan Kamara <idankk86@gmail.com>
parents: 8
diff changeset
556 def tip(self):
fce3102c19e5 client: sort commands by name
Idan Kamara <idankk86@gmail.com>
parents: 8
diff changeset
557 args = cmdbuilder('tip', template=templates.changeset)
5
3182303f388d client: rawcommand, more convenient helper to run commands instead of outputruncommand
Idan Kamara <idankk86@gmail.com>
parents: 4
diff changeset
558 out = self.rawcommand(args)
10
fce3102c19e5 client: sort commands by name
Idan Kamara <idankk86@gmail.com>
parents: 8
diff changeset
559 out = out.split('\0')
2
5fa34c3ac9a0 turn hglib into a module and expose open (previously connect) in its __init__.py
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
560
10
fce3102c19e5 client: sort commands by name
Idan Kamara <idankk86@gmail.com>
parents: 8
diff changeset
561 return self._parserevs(out)[0]
fce3102c19e5 client: sort commands by name
Idan Kamara <idankk86@gmail.com>
parents: 8
diff changeset
562
20
6a9d16ddae31 client: add update command
Idan Kamara <idankk86@gmail.com>
parents: 18
diff changeset
563 def update(self, rev=None, clean=False, check=False, date=None):
6a9d16ddae31 client: add update command
Idan Kamara <idankk86@gmail.com>
parents: 18
diff changeset
564 """
6a9d16ddae31 client: add update command
Idan Kamara <idankk86@gmail.com>
parents: 18
diff changeset
565 Update the repository's working directory to changeset specified by rev.
6a9d16ddae31 client: add update command
Idan Kamara <idankk86@gmail.com>
parents: 18
diff changeset
566 If rev isn't specified, update to the tip of the current named branch.
6a9d16ddae31 client: add update command
Idan Kamara <idankk86@gmail.com>
parents: 18
diff changeset
567
6a9d16ddae31 client: add update command
Idan Kamara <idankk86@gmail.com>
parents: 18
diff changeset
568 Return the number of files (updated, merged, removed, unresolved)
6a9d16ddae31 client: add update command
Idan Kamara <idankk86@gmail.com>
parents: 18
diff changeset
569 """
6a9d16ddae31 client: add update command
Idan Kamara <idankk86@gmail.com>
parents: 18
diff changeset
570 if clean and check:
6a9d16ddae31 client: add update command
Idan Kamara <idankk86@gmail.com>
parents: 18
diff changeset
571 raise ValueError('clean and check cannot both be True')
6a9d16ddae31 client: add update command
Idan Kamara <idankk86@gmail.com>
parents: 18
diff changeset
572
6a9d16ddae31 client: add update command
Idan Kamara <idankk86@gmail.com>
parents: 18
diff changeset
573 args = cmdbuilder('update', r=rev, C=clean, c=check, d=date)
6a9d16ddae31 client: add update command
Idan Kamara <idankk86@gmail.com>
parents: 18
diff changeset
574
6a9d16ddae31 client: add update command
Idan Kamara <idankk86@gmail.com>
parents: 18
diff changeset
575 def eh(ret, out, err):
6a9d16ddae31 client: add update command
Idan Kamara <idankk86@gmail.com>
parents: 18
diff changeset
576 if ret == 1:
6a9d16ddae31 client: add update command
Idan Kamara <idankk86@gmail.com>
parents: 18
diff changeset
577 return out
6a9d16ddae31 client: add update command
Idan Kamara <idankk86@gmail.com>
parents: 18
diff changeset
578
6a9d16ddae31 client: add update command
Idan Kamara <idankk86@gmail.com>
parents: 18
diff changeset
579 raise error.CommandError(args, ret, out, err)
6a9d16ddae31 client: add update command
Idan Kamara <idankk86@gmail.com>
parents: 18
diff changeset
580
6a9d16ddae31 client: add update command
Idan Kamara <idankk86@gmail.com>
parents: 18
diff changeset
581
6a9d16ddae31 client: add update command
Idan Kamara <idankk86@gmail.com>
parents: 18
diff changeset
582 out = self.rawcommand(args, eh=eh)
6a9d16ddae31 client: add update command
Idan Kamara <idankk86@gmail.com>
parents: 18
diff changeset
583
6a9d16ddae31 client: add update command
Idan Kamara <idankk86@gmail.com>
parents: 18
diff changeset
584 # filter out 'merging ...' lines
6a9d16ddae31 client: add update command
Idan Kamara <idankk86@gmail.com>
parents: 18
diff changeset
585 out = util.skiplines(out, 'merging ')
6a9d16ddae31 client: add update command
Idan Kamara <idankk86@gmail.com>
parents: 18
diff changeset
586
6a9d16ddae31 client: add update command
Idan Kamara <idankk86@gmail.com>
parents: 18
diff changeset
587 counters = out.rstrip().split(', ')
6a9d16ddae31 client: add update command
Idan Kamara <idankk86@gmail.com>
parents: 18
diff changeset
588 return tuple(int(s.split(' ', 1)[0]) for s in counters)