##// END OF EJS Templates
test-commandserver: make runcommand message bolder...
Yuya Nishihara -
r22572:cc3d9f77 default
parent child Browse files
Show More
@@ -1,72 +1,72 b''
1 # A minimal client for Mercurial's command server
1 # A minimal client for Mercurial's command server
2
2
3 import sys, struct, subprocess, cStringIO
3 import sys, struct, subprocess, cStringIO
4
4
5 def connect(path=None):
5 def connect(path=None):
6 cmdline = ['hg', 'serve', '--cmdserver', 'pipe']
6 cmdline = ['hg', 'serve', '--cmdserver', 'pipe']
7 if path:
7 if path:
8 cmdline += ['-R', path]
8 cmdline += ['-R', path]
9
9
10 server = subprocess.Popen(cmdline, stdin=subprocess.PIPE,
10 server = subprocess.Popen(cmdline, stdin=subprocess.PIPE,
11 stdout=subprocess.PIPE)
11 stdout=subprocess.PIPE)
12
12
13 return server
13 return server
14
14
15 def writeblock(server, data):
15 def writeblock(server, data):
16 server.stdin.write(struct.pack('>I', len(data)))
16 server.stdin.write(struct.pack('>I', len(data)))
17 server.stdin.write(data)
17 server.stdin.write(data)
18 server.stdin.flush()
18 server.stdin.flush()
19
19
20 def readchannel(server):
20 def readchannel(server):
21 data = server.stdout.read(5)
21 data = server.stdout.read(5)
22 if not data:
22 if not data:
23 raise EOFError
23 raise EOFError
24 channel, length = struct.unpack('>cI', data)
24 channel, length = struct.unpack('>cI', data)
25 if channel in 'IL':
25 if channel in 'IL':
26 return channel, length
26 return channel, length
27 else:
27 else:
28 return channel, server.stdout.read(length)
28 return channel, server.stdout.read(length)
29
29
30 def sep(text):
30 def sep(text):
31 return text.replace('\\', '/')
31 return text.replace('\\', '/')
32
32
33 def runcommand(server, args, output=sys.stdout, error=sys.stderr, input=None,
33 def runcommand(server, args, output=sys.stdout, error=sys.stderr, input=None,
34 outfilter=lambda x: x):
34 outfilter=lambda x: x):
35 print ' runcommand', ' '.join(args)
35 print '*** runcommand', ' '.join(args)
36 sys.stdout.flush()
36 sys.stdout.flush()
37 server.stdin.write('runcommand\n')
37 server.stdin.write('runcommand\n')
38 writeblock(server, '\0'.join(args))
38 writeblock(server, '\0'.join(args))
39
39
40 if not input:
40 if not input:
41 input = cStringIO.StringIO()
41 input = cStringIO.StringIO()
42
42
43 while True:
43 while True:
44 ch, data = readchannel(server)
44 ch, data = readchannel(server)
45 if ch == 'o':
45 if ch == 'o':
46 output.write(outfilter(data))
46 output.write(outfilter(data))
47 output.flush()
47 output.flush()
48 elif ch == 'e':
48 elif ch == 'e':
49 error.write(data)
49 error.write(data)
50 error.flush()
50 error.flush()
51 elif ch == 'I':
51 elif ch == 'I':
52 writeblock(server, input.read(data))
52 writeblock(server, input.read(data))
53 elif ch == 'L':
53 elif ch == 'L':
54 writeblock(server, input.readline(data))
54 writeblock(server, input.readline(data))
55 elif ch == 'r':
55 elif ch == 'r':
56 ret, = struct.unpack('>i', data)
56 ret, = struct.unpack('>i', data)
57 if ret != 0:
57 if ret != 0:
58 print ' [%d]' % ret
58 print ' [%d]' % ret
59 return ret
59 return ret
60 else:
60 else:
61 print "unexpected channel %c: %r" % (ch, data)
61 print "unexpected channel %c: %r" % (ch, data)
62 if ch.isupper():
62 if ch.isupper():
63 return
63 return
64
64
65 def check(func, repopath=None):
65 def check(func, repopath=None):
66 sys.stdout.flush()
66 sys.stdout.flush()
67 server = connect(repopath)
67 server = connect(repopath)
68 try:
68 try:
69 return func(server)
69 return func(server)
70 finally:
70 finally:
71 server.stdin.close()
71 server.stdin.close()
72 server.wait()
72 server.wait()
@@ -1,543 +1,543 b''
1 #if windows
1 #if windows
2 $ PYTHONPATH="$TESTDIR/../contrib;$PYTHONPATH"
2 $ PYTHONPATH="$TESTDIR/../contrib;$PYTHONPATH"
3 #else
3 #else
4 $ PYTHONPATH="$TESTDIR/../contrib:$PYTHONPATH"
4 $ PYTHONPATH="$TESTDIR/../contrib:$PYTHONPATH"
5 #endif
5 #endif
6 $ export PYTHONPATH
6 $ export PYTHONPATH
7
7
8 $ hg init repo
8 $ hg init repo
9 $ cd repo
9 $ cd repo
10
10
11 >>> from hgclient import readchannel, runcommand, check
11 >>> from hgclient import readchannel, runcommand, check
12 >>> @check
12 >>> @check
13 ... def hellomessage(server):
13 ... def hellomessage(server):
14 ... ch, data = readchannel(server)
14 ... ch, data = readchannel(server)
15 ... print '%c, %r' % (ch, data)
15 ... print '%c, %r' % (ch, data)
16 ... # run an arbitrary command to make sure the next thing the server
16 ... # run an arbitrary command to make sure the next thing the server
17 ... # sends isn't part of the hello message
17 ... # sends isn't part of the hello message
18 ... runcommand(server, ['id'])
18 ... runcommand(server, ['id'])
19 o, 'capabilities: getencoding runcommand\nencoding: *' (glob)
19 o, 'capabilities: getencoding runcommand\nencoding: *' (glob)
20 runcommand id
20 *** runcommand id
21 000000000000 tip
21 000000000000 tip
22
22
23 >>> from hgclient import check
23 >>> from hgclient import check
24 >>> @check
24 >>> @check
25 ... def unknowncommand(server):
25 ... def unknowncommand(server):
26 ... server.stdin.write('unknowncommand\n')
26 ... server.stdin.write('unknowncommand\n')
27 abort: unknown command unknowncommand
27 abort: unknown command unknowncommand
28
28
29 >>> from hgclient import readchannel, runcommand, check
29 >>> from hgclient import readchannel, runcommand, check
30 >>> @check
30 >>> @check
31 ... def checkruncommand(server):
31 ... def checkruncommand(server):
32 ... # hello block
32 ... # hello block
33 ... readchannel(server)
33 ... readchannel(server)
34 ...
34 ...
35 ... # no args
35 ... # no args
36 ... runcommand(server, [])
36 ... runcommand(server, [])
37 ...
37 ...
38 ... # global options
38 ... # global options
39 ... runcommand(server, ['id', '--quiet'])
39 ... runcommand(server, ['id', '--quiet'])
40 ...
40 ...
41 ... # make sure global options don't stick through requests
41 ... # make sure global options don't stick through requests
42 ... runcommand(server, ['id'])
42 ... runcommand(server, ['id'])
43 ...
43 ...
44 ... # --config
44 ... # --config
45 ... runcommand(server, ['id', '--config', 'ui.quiet=True'])
45 ... runcommand(server, ['id', '--config', 'ui.quiet=True'])
46 ...
46 ...
47 ... # make sure --config doesn't stick
47 ... # make sure --config doesn't stick
48 ... runcommand(server, ['id'])
48 ... runcommand(server, ['id'])
49 ...
49 ...
50 ... # negative return code should be masked
50 ... # negative return code should be masked
51 ... runcommand(server, ['id', '-runknown'])
51 ... runcommand(server, ['id', '-runknown'])
52 runcommand
52 *** runcommand
53 Mercurial Distributed SCM
53 Mercurial Distributed SCM
54
54
55 basic commands:
55 basic commands:
56
56
57 add add the specified files on the next commit
57 add add the specified files on the next commit
58 annotate show changeset information by line for each file
58 annotate show changeset information by line for each file
59 clone make a copy of an existing repository
59 clone make a copy of an existing repository
60 commit commit the specified files or all outstanding changes
60 commit commit the specified files or all outstanding changes
61 diff diff repository (or selected files)
61 diff diff repository (or selected files)
62 export dump the header and diffs for one or more changesets
62 export dump the header and diffs for one or more changesets
63 forget forget the specified files on the next commit
63 forget forget the specified files on the next commit
64 init create a new repository in the given directory
64 init create a new repository in the given directory
65 log show revision history of entire repository or files
65 log show revision history of entire repository or files
66 merge merge working directory with another revision
66 merge merge working directory with another revision
67 pull pull changes from the specified source
67 pull pull changes from the specified source
68 push push changes to the specified destination
68 push push changes to the specified destination
69 remove remove the specified files on the next commit
69 remove remove the specified files on the next commit
70 serve start stand-alone webserver
70 serve start stand-alone webserver
71 status show changed files in the working directory
71 status show changed files in the working directory
72 summary summarize working directory state
72 summary summarize working directory state
73 update update working directory (or switch revisions)
73 update update working directory (or switch revisions)
74
74
75 (use "hg help" for the full list of commands or "hg -v" for details)
75 (use "hg help" for the full list of commands or "hg -v" for details)
76 runcommand id --quiet
76 *** runcommand id --quiet
77 000000000000
77 000000000000
78 runcommand id
78 *** runcommand id
79 000000000000 tip
79 000000000000 tip
80 runcommand id --config ui.quiet=True
80 *** runcommand id --config ui.quiet=True
81 000000000000
81 000000000000
82 runcommand id
82 *** runcommand id
83 000000000000 tip
83 000000000000 tip
84 runcommand id -runknown
84 *** runcommand id -runknown
85 abort: unknown revision 'unknown'!
85 abort: unknown revision 'unknown'!
86 [255]
86 [255]
87
87
88 >>> from hgclient import readchannel, check
88 >>> from hgclient import readchannel, check
89 >>> @check
89 >>> @check
90 ... def inputeof(server):
90 ... def inputeof(server):
91 ... readchannel(server)
91 ... readchannel(server)
92 ... server.stdin.write('runcommand\n')
92 ... server.stdin.write('runcommand\n')
93 ... # close stdin while server is waiting for input
93 ... # close stdin while server is waiting for input
94 ... server.stdin.close()
94 ... server.stdin.close()
95 ...
95 ...
96 ... # server exits with 1 if the pipe closed while reading the command
96 ... # server exits with 1 if the pipe closed while reading the command
97 ... print 'server exit code =', server.wait()
97 ... print 'server exit code =', server.wait()
98 server exit code = 1
98 server exit code = 1
99
99
100 >>> import cStringIO
100 >>> import cStringIO
101 >>> from hgclient import readchannel, runcommand, check
101 >>> from hgclient import readchannel, runcommand, check
102 >>> @check
102 >>> @check
103 ... def serverinput(server):
103 ... def serverinput(server):
104 ... readchannel(server)
104 ... readchannel(server)
105 ...
105 ...
106 ... patch = """
106 ... patch = """
107 ... # HG changeset patch
107 ... # HG changeset patch
108 ... # User test
108 ... # User test
109 ... # Date 0 0
109 ... # Date 0 0
110 ... # Node ID c103a3dec114d882c98382d684d8af798d09d857
110 ... # Node ID c103a3dec114d882c98382d684d8af798d09d857
111 ... # Parent 0000000000000000000000000000000000000000
111 ... # Parent 0000000000000000000000000000000000000000
112 ... 1
112 ... 1
113 ...
113 ...
114 ... diff -r 000000000000 -r c103a3dec114 a
114 ... diff -r 000000000000 -r c103a3dec114 a
115 ... --- /dev/null Thu Jan 01 00:00:00 1970 +0000
115 ... --- /dev/null Thu Jan 01 00:00:00 1970 +0000
116 ... +++ b/a Thu Jan 01 00:00:00 1970 +0000
116 ... +++ b/a Thu Jan 01 00:00:00 1970 +0000
117 ... @@ -0,0 +1,1 @@
117 ... @@ -0,0 +1,1 @@
118 ... +1
118 ... +1
119 ... """
119 ... """
120 ...
120 ...
121 ... runcommand(server, ['import', '-'], input=cStringIO.StringIO(patch))
121 ... runcommand(server, ['import', '-'], input=cStringIO.StringIO(patch))
122 ... runcommand(server, ['log'])
122 ... runcommand(server, ['log'])
123 runcommand import -
123 *** runcommand import -
124 applying patch from stdin
124 applying patch from stdin
125 runcommand log
125 *** runcommand log
126 changeset: 0:eff892de26ec
126 changeset: 0:eff892de26ec
127 tag: tip
127 tag: tip
128 user: test
128 user: test
129 date: Thu Jan 01 00:00:00 1970 +0000
129 date: Thu Jan 01 00:00:00 1970 +0000
130 summary: 1
130 summary: 1
131
131
132
132
133 check that --cwd doesn't persist between requests:
133 check that --cwd doesn't persist between requests:
134
134
135 $ mkdir foo
135 $ mkdir foo
136 $ touch foo/bar
136 $ touch foo/bar
137 >>> from hgclient import readchannel, runcommand, check
137 >>> from hgclient import readchannel, runcommand, check
138 >>> @check
138 >>> @check
139 ... def cwd(server):
139 ... def cwd(server):
140 ... readchannel(server)
140 ... readchannel(server)
141 ... runcommand(server, ['--cwd', 'foo', 'st', 'bar'])
141 ... runcommand(server, ['--cwd', 'foo', 'st', 'bar'])
142 ... runcommand(server, ['st', 'foo/bar'])
142 ... runcommand(server, ['st', 'foo/bar'])
143 runcommand --cwd foo st bar
143 *** runcommand --cwd foo st bar
144 ? bar
144 ? bar
145 runcommand st foo/bar
145 *** runcommand st foo/bar
146 ? foo/bar
146 ? foo/bar
147
147
148 $ rm foo/bar
148 $ rm foo/bar
149
149
150
150
151 check that local configs for the cached repo aren't inherited when -R is used:
151 check that local configs for the cached repo aren't inherited when -R is used:
152
152
153 $ cat <<EOF >> .hg/hgrc
153 $ cat <<EOF >> .hg/hgrc
154 > [ui]
154 > [ui]
155 > foo = bar
155 > foo = bar
156 > EOF
156 > EOF
157
157
158 >>> from hgclient import readchannel, sep, runcommand, check
158 >>> from hgclient import readchannel, sep, runcommand, check
159 >>> @check
159 >>> @check
160 ... def localhgrc(server):
160 ... def localhgrc(server):
161 ... readchannel(server)
161 ... readchannel(server)
162 ...
162 ...
163 ... # the cached repo local hgrc contains ui.foo=bar, so showconfig should
163 ... # the cached repo local hgrc contains ui.foo=bar, so showconfig should
164 ... # show it
164 ... # show it
165 ... runcommand(server, ['showconfig'], outfilter=sep)
165 ... runcommand(server, ['showconfig'], outfilter=sep)
166 ...
166 ...
167 ... # but not for this repo
167 ... # but not for this repo
168 ... runcommand(server, ['init', 'foo'])
168 ... runcommand(server, ['init', 'foo'])
169 ... runcommand(server, ['-R', 'foo', 'showconfig', 'ui', 'defaults'])
169 ... runcommand(server, ['-R', 'foo', 'showconfig', 'ui', 'defaults'])
170 runcommand showconfig
170 *** runcommand showconfig
171 bundle.mainreporoot=$TESTTMP/repo
171 bundle.mainreporoot=$TESTTMP/repo
172 defaults.backout=-d "0 0"
172 defaults.backout=-d "0 0"
173 defaults.commit=-d "0 0"
173 defaults.commit=-d "0 0"
174 defaults.shelve=--date "0 0"
174 defaults.shelve=--date "0 0"
175 defaults.tag=-d "0 0"
175 defaults.tag=-d "0 0"
176 ui.slash=True
176 ui.slash=True
177 ui.interactive=False
177 ui.interactive=False
178 ui.mergemarkers=detailed
178 ui.mergemarkers=detailed
179 ui.foo=bar
179 ui.foo=bar
180 ui.nontty=true
180 ui.nontty=true
181 runcommand init foo
181 *** runcommand init foo
182 runcommand -R foo showconfig ui defaults
182 *** runcommand -R foo showconfig ui defaults
183 defaults.backout=-d "0 0"
183 defaults.backout=-d "0 0"
184 defaults.commit=-d "0 0"
184 defaults.commit=-d "0 0"
185 defaults.shelve=--date "0 0"
185 defaults.shelve=--date "0 0"
186 defaults.tag=-d "0 0"
186 defaults.tag=-d "0 0"
187 ui.slash=True
187 ui.slash=True
188 ui.interactive=False
188 ui.interactive=False
189 ui.mergemarkers=detailed
189 ui.mergemarkers=detailed
190 ui.nontty=true
190 ui.nontty=true
191
191
192 $ rm -R foo
192 $ rm -R foo
193
193
194 #if windows
194 #if windows
195 $ PYTHONPATH="$TESTTMP/repo;$PYTHONPATH"
195 $ PYTHONPATH="$TESTTMP/repo;$PYTHONPATH"
196 #else
196 #else
197 $ PYTHONPATH="$TESTTMP/repo:$PYTHONPATH"
197 $ PYTHONPATH="$TESTTMP/repo:$PYTHONPATH"
198 #endif
198 #endif
199
199
200 $ cat <<EOF > hook.py
200 $ cat <<EOF > hook.py
201 > import sys
201 > import sys
202 > def hook(**args):
202 > def hook(**args):
203 > print 'hook talking'
203 > print 'hook talking'
204 > print 'now try to read something: %r' % sys.stdin.read()
204 > print 'now try to read something: %r' % sys.stdin.read()
205 > EOF
205 > EOF
206
206
207 >>> import cStringIO
207 >>> import cStringIO
208 >>> from hgclient import readchannel, runcommand, check
208 >>> from hgclient import readchannel, runcommand, check
209 >>> @check
209 >>> @check
210 ... def hookoutput(server):
210 ... def hookoutput(server):
211 ... readchannel(server)
211 ... readchannel(server)
212 ... runcommand(server, ['--config',
212 ... runcommand(server, ['--config',
213 ... 'hooks.pre-identify=python:hook.hook',
213 ... 'hooks.pre-identify=python:hook.hook',
214 ... 'id'],
214 ... 'id'],
215 ... input=cStringIO.StringIO('some input'))
215 ... input=cStringIO.StringIO('some input'))
216 runcommand --config hooks.pre-identify=python:hook.hook id
216 *** runcommand --config hooks.pre-identify=python:hook.hook id
217 hook talking
217 hook talking
218 now try to read something: 'some input'
218 now try to read something: 'some input'
219 eff892de26ec tip
219 eff892de26ec tip
220
220
221 $ rm hook.py*
221 $ rm hook.py*
222
222
223 $ echo a >> a
223 $ echo a >> a
224 >>> import os
224 >>> import os
225 >>> from hgclient import readchannel, runcommand, check
225 >>> from hgclient import readchannel, runcommand, check
226 >>> @check
226 >>> @check
227 ... def outsidechanges(server):
227 ... def outsidechanges(server):
228 ... readchannel(server)
228 ... readchannel(server)
229 ... runcommand(server, ['status'])
229 ... runcommand(server, ['status'])
230 ... os.system('hg ci -Am2')
230 ... os.system('hg ci -Am2')
231 ... runcommand(server, ['tip'])
231 ... runcommand(server, ['tip'])
232 ... runcommand(server, ['status'])
232 ... runcommand(server, ['status'])
233 runcommand status
233 *** runcommand status
234 M a
234 M a
235 runcommand tip
235 *** runcommand tip
236 changeset: 1:d3a0a68be6de
236 changeset: 1:d3a0a68be6de
237 tag: tip
237 tag: tip
238 user: test
238 user: test
239 date: Thu Jan 01 00:00:00 1970 +0000
239 date: Thu Jan 01 00:00:00 1970 +0000
240 summary: 2
240 summary: 2
241
241
242 runcommand status
242 *** runcommand status
243
243
244 >>> import os
244 >>> import os
245 >>> from hgclient import readchannel, runcommand, check
245 >>> from hgclient import readchannel, runcommand, check
246 >>> @check
246 >>> @check
247 ... def bookmarks(server):
247 ... def bookmarks(server):
248 ... readchannel(server)
248 ... readchannel(server)
249 ... runcommand(server, ['bookmarks'])
249 ... runcommand(server, ['bookmarks'])
250 ...
250 ...
251 ... # changes .hg/bookmarks
251 ... # changes .hg/bookmarks
252 ... os.system('hg bookmark -i bm1')
252 ... os.system('hg bookmark -i bm1')
253 ... os.system('hg bookmark -i bm2')
253 ... os.system('hg bookmark -i bm2')
254 ... runcommand(server, ['bookmarks'])
254 ... runcommand(server, ['bookmarks'])
255 ...
255 ...
256 ... # changes .hg/bookmarks.current
256 ... # changes .hg/bookmarks.current
257 ... os.system('hg upd bm1 -q')
257 ... os.system('hg upd bm1 -q')
258 ... runcommand(server, ['bookmarks'])
258 ... runcommand(server, ['bookmarks'])
259 ...
259 ...
260 ... runcommand(server, ['bookmarks', 'bm3'])
260 ... runcommand(server, ['bookmarks', 'bm3'])
261 ... f = open('a', 'ab')
261 ... f = open('a', 'ab')
262 ... f.write('a\n')
262 ... f.write('a\n')
263 ... f.close()
263 ... f.close()
264 ... runcommand(server, ['commit', '-Amm'])
264 ... runcommand(server, ['commit', '-Amm'])
265 ... runcommand(server, ['bookmarks'])
265 ... runcommand(server, ['bookmarks'])
266 runcommand bookmarks
266 *** runcommand bookmarks
267 no bookmarks set
267 no bookmarks set
268 runcommand bookmarks
268 *** runcommand bookmarks
269 bm1 1:d3a0a68be6de
269 bm1 1:d3a0a68be6de
270 bm2 1:d3a0a68be6de
270 bm2 1:d3a0a68be6de
271 runcommand bookmarks
271 *** runcommand bookmarks
272 * bm1 1:d3a0a68be6de
272 * bm1 1:d3a0a68be6de
273 bm2 1:d3a0a68be6de
273 bm2 1:d3a0a68be6de
274 runcommand bookmarks bm3
274 *** runcommand bookmarks bm3
275 runcommand commit -Amm
275 *** runcommand commit -Amm
276 runcommand bookmarks
276 *** runcommand bookmarks
277 bm1 1:d3a0a68be6de
277 bm1 1:d3a0a68be6de
278 bm2 1:d3a0a68be6de
278 bm2 1:d3a0a68be6de
279 * bm3 2:aef17e88f5f0
279 * bm3 2:aef17e88f5f0
280
280
281 >>> import os
281 >>> import os
282 >>> from hgclient import readchannel, runcommand, check
282 >>> from hgclient import readchannel, runcommand, check
283 >>> @check
283 >>> @check
284 ... def tagscache(server):
284 ... def tagscache(server):
285 ... readchannel(server)
285 ... readchannel(server)
286 ... runcommand(server, ['id', '-t', '-r', '0'])
286 ... runcommand(server, ['id', '-t', '-r', '0'])
287 ... os.system('hg tag -r 0 foo')
287 ... os.system('hg tag -r 0 foo')
288 ... runcommand(server, ['id', '-t', '-r', '0'])
288 ... runcommand(server, ['id', '-t', '-r', '0'])
289 runcommand id -t -r 0
289 *** runcommand id -t -r 0
290
290
291 runcommand id -t -r 0
291 *** runcommand id -t -r 0
292 foo
292 foo
293
293
294 >>> import os
294 >>> import os
295 >>> from hgclient import readchannel, runcommand, check
295 >>> from hgclient import readchannel, runcommand, check
296 >>> @check
296 >>> @check
297 ... def setphase(server):
297 ... def setphase(server):
298 ... readchannel(server)
298 ... readchannel(server)
299 ... runcommand(server, ['phase', '-r', '.'])
299 ... runcommand(server, ['phase', '-r', '.'])
300 ... os.system('hg phase -r . -p')
300 ... os.system('hg phase -r . -p')
301 ... runcommand(server, ['phase', '-r', '.'])
301 ... runcommand(server, ['phase', '-r', '.'])
302 runcommand phase -r .
302 *** runcommand phase -r .
303 3: draft
303 3: draft
304 runcommand phase -r .
304 *** runcommand phase -r .
305 3: public
305 3: public
306
306
307 $ echo a >> a
307 $ echo a >> a
308 >>> from hgclient import readchannel, runcommand, check
308 >>> from hgclient import readchannel, runcommand, check
309 >>> @check
309 >>> @check
310 ... def rollback(server):
310 ... def rollback(server):
311 ... readchannel(server)
311 ... readchannel(server)
312 ... runcommand(server, ['phase', '-r', '.', '-p'])
312 ... runcommand(server, ['phase', '-r', '.', '-p'])
313 ... runcommand(server, ['commit', '-Am.'])
313 ... runcommand(server, ['commit', '-Am.'])
314 ... runcommand(server, ['rollback'])
314 ... runcommand(server, ['rollback'])
315 ... runcommand(server, ['phase', '-r', '.'])
315 ... runcommand(server, ['phase', '-r', '.'])
316 runcommand phase -r . -p
316 *** runcommand phase -r . -p
317 no phases changed
317 no phases changed
318 [1]
318 [1]
319 runcommand commit -Am.
319 *** runcommand commit -Am.
320 runcommand rollback
320 *** runcommand rollback
321 repository tip rolled back to revision 3 (undo commit)
321 repository tip rolled back to revision 3 (undo commit)
322 working directory now based on revision 3
322 working directory now based on revision 3
323 runcommand phase -r .
323 *** runcommand phase -r .
324 3: public
324 3: public
325
325
326 >>> import os
326 >>> import os
327 >>> from hgclient import readchannel, runcommand, check
327 >>> from hgclient import readchannel, runcommand, check
328 >>> @check
328 >>> @check
329 ... def branch(server):
329 ... def branch(server):
330 ... readchannel(server)
330 ... readchannel(server)
331 ... runcommand(server, ['branch'])
331 ... runcommand(server, ['branch'])
332 ... os.system('hg branch foo')
332 ... os.system('hg branch foo')
333 ... runcommand(server, ['branch'])
333 ... runcommand(server, ['branch'])
334 ... os.system('hg branch default')
334 ... os.system('hg branch default')
335 runcommand branch
335 *** runcommand branch
336 default
336 default
337 marked working directory as branch foo
337 marked working directory as branch foo
338 (branches are permanent and global, did you want a bookmark?)
338 (branches are permanent and global, did you want a bookmark?)
339 runcommand branch
339 *** runcommand branch
340 foo
340 foo
341 marked working directory as branch default
341 marked working directory as branch default
342 (branches are permanent and global, did you want a bookmark?)
342 (branches are permanent and global, did you want a bookmark?)
343
343
344 $ touch .hgignore
344 $ touch .hgignore
345 >>> import os
345 >>> import os
346 >>> from hgclient import readchannel, runcommand, check
346 >>> from hgclient import readchannel, runcommand, check
347 >>> @check
347 >>> @check
348 ... def hgignore(server):
348 ... def hgignore(server):
349 ... readchannel(server)
349 ... readchannel(server)
350 ... runcommand(server, ['commit', '-Am.'])
350 ... runcommand(server, ['commit', '-Am.'])
351 ... f = open('ignored-file', 'ab')
351 ... f = open('ignored-file', 'ab')
352 ... f.write('')
352 ... f.write('')
353 ... f.close()
353 ... f.close()
354 ... f = open('.hgignore', 'ab')
354 ... f = open('.hgignore', 'ab')
355 ... f.write('ignored-file')
355 ... f.write('ignored-file')
356 ... f.close()
356 ... f.close()
357 ... runcommand(server, ['status', '-i', '-u'])
357 ... runcommand(server, ['status', '-i', '-u'])
358 runcommand commit -Am.
358 *** runcommand commit -Am.
359 adding .hgignore
359 adding .hgignore
360 runcommand status -i -u
360 *** runcommand status -i -u
361 I ignored-file
361 I ignored-file
362
362
363 >>> import os
363 >>> import os
364 >>> from hgclient import readchannel, sep, runcommand, check
364 >>> from hgclient import readchannel, sep, runcommand, check
365 >>> @check
365 >>> @check
366 ... def phasecacheafterstrip(server):
366 ... def phasecacheafterstrip(server):
367 ... readchannel(server)
367 ... readchannel(server)
368 ...
368 ...
369 ... # create new head, 5:731265503d86
369 ... # create new head, 5:731265503d86
370 ... runcommand(server, ['update', '-C', '0'])
370 ... runcommand(server, ['update', '-C', '0'])
371 ... f = open('a', 'ab')
371 ... f = open('a', 'ab')
372 ... f.write('a\n')
372 ... f.write('a\n')
373 ... f.close()
373 ... f.close()
374 ... runcommand(server, ['commit', '-Am.', 'a'])
374 ... runcommand(server, ['commit', '-Am.', 'a'])
375 ... runcommand(server, ['log', '-Gq'])
375 ... runcommand(server, ['log', '-Gq'])
376 ...
376 ...
377 ... # make it public; draft marker moves to 4:7966c8e3734d
377 ... # make it public; draft marker moves to 4:7966c8e3734d
378 ... runcommand(server, ['phase', '-p', '.'])
378 ... runcommand(server, ['phase', '-p', '.'])
379 ... # load _phasecache.phaseroots
379 ... # load _phasecache.phaseroots
380 ... runcommand(server, ['phase', '.'], outfilter=sep)
380 ... runcommand(server, ['phase', '.'], outfilter=sep)
381 ...
381 ...
382 ... # strip 1::4 outside server
382 ... # strip 1::4 outside server
383 ... os.system('hg -q --config extensions.mq= strip 1')
383 ... os.system('hg -q --config extensions.mq= strip 1')
384 ...
384 ...
385 ... # shouldn't raise "7966c8e3734d: no node!"
385 ... # shouldn't raise "7966c8e3734d: no node!"
386 ... runcommand(server, ['branches'])
386 ... runcommand(server, ['branches'])
387 runcommand update -C 0
387 *** runcommand update -C 0
388 1 files updated, 0 files merged, 2 files removed, 0 files unresolved
388 1 files updated, 0 files merged, 2 files removed, 0 files unresolved
389 (leaving bookmark bm3)
389 (leaving bookmark bm3)
390 runcommand commit -Am. a
390 *** runcommand commit -Am. a
391 created new head
391 created new head
392 runcommand log -Gq
392 *** runcommand log -Gq
393 @ 5:731265503d86
393 @ 5:731265503d86
394 |
394 |
395 | o 4:7966c8e3734d
395 | o 4:7966c8e3734d
396 | |
396 | |
397 | o 3:b9b85890c400
397 | o 3:b9b85890c400
398 | |
398 | |
399 | o 2:aef17e88f5f0
399 | o 2:aef17e88f5f0
400 | |
400 | |
401 | o 1:d3a0a68be6de
401 | o 1:d3a0a68be6de
402 |/
402 |/
403 o 0:eff892de26ec
403 o 0:eff892de26ec
404
404
405 runcommand phase -p .
405 *** runcommand phase -p .
406 runcommand phase .
406 *** runcommand phase .
407 5: public
407 5: public
408 runcommand branches
408 *** runcommand branches
409 default 1:731265503d86
409 default 1:731265503d86
410
410
411 $ cat <<EOF > obs.py
411 $ cat <<EOF > obs.py
412 > import mercurial.obsolete
412 > import mercurial.obsolete
413 > mercurial.obsolete._enabled = True
413 > mercurial.obsolete._enabled = True
414 > EOF
414 > EOF
415 $ cat <<EOF >> .hg/hgrc
415 $ cat <<EOF >> .hg/hgrc
416 > [extensions]
416 > [extensions]
417 > obs = obs.py
417 > obs = obs.py
418 > EOF
418 > EOF
419
419
420 >>> import os
420 >>> import os
421 >>> from hgclient import readchannel, runcommand, check
421 >>> from hgclient import readchannel, runcommand, check
422 >>> @check
422 >>> @check
423 ... def obsolete(server):
423 ... def obsolete(server):
424 ... readchannel(server)
424 ... readchannel(server)
425 ...
425 ...
426 ... runcommand(server, ['up', 'null'])
426 ... runcommand(server, ['up', 'null'])
427 ... runcommand(server, ['phase', '-df', 'tip'])
427 ... runcommand(server, ['phase', '-df', 'tip'])
428 ... cmd = 'hg debugobsolete `hg log -r tip --template {node}`'
428 ... cmd = 'hg debugobsolete `hg log -r tip --template {node}`'
429 ... if os.name == 'nt':
429 ... if os.name == 'nt':
430 ... cmd = 'sh -c "%s"' % cmd # run in sh, not cmd.exe
430 ... cmd = 'sh -c "%s"' % cmd # run in sh, not cmd.exe
431 ... os.system(cmd)
431 ... os.system(cmd)
432 ... runcommand(server, ['log', '--hidden'])
432 ... runcommand(server, ['log', '--hidden'])
433 ... runcommand(server, ['log'])
433 ... runcommand(server, ['log'])
434 runcommand up null
434 *** runcommand up null
435 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
435 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
436 runcommand phase -df tip
436 *** runcommand phase -df tip
437 runcommand log --hidden
437 *** runcommand log --hidden
438 changeset: 1:731265503d86
438 changeset: 1:731265503d86
439 tag: tip
439 tag: tip
440 user: test
440 user: test
441 date: Thu Jan 01 00:00:00 1970 +0000
441 date: Thu Jan 01 00:00:00 1970 +0000
442 summary: .
442 summary: .
443
443
444 changeset: 0:eff892de26ec
444 changeset: 0:eff892de26ec
445 bookmark: bm1
445 bookmark: bm1
446 bookmark: bm2
446 bookmark: bm2
447 bookmark: bm3
447 bookmark: bm3
448 user: test
448 user: test
449 date: Thu Jan 01 00:00:00 1970 +0000
449 date: Thu Jan 01 00:00:00 1970 +0000
450 summary: 1
450 summary: 1
451
451
452 runcommand log
452 *** runcommand log
453 changeset: 0:eff892de26ec
453 changeset: 0:eff892de26ec
454 bookmark: bm1
454 bookmark: bm1
455 bookmark: bm2
455 bookmark: bm2
456 bookmark: bm3
456 bookmark: bm3
457 tag: tip
457 tag: tip
458 user: test
458 user: test
459 date: Thu Jan 01 00:00:00 1970 +0000
459 date: Thu Jan 01 00:00:00 1970 +0000
460 summary: 1
460 summary: 1
461
461
462
462
463 $ cat <<EOF >> .hg/hgrc
463 $ cat <<EOF >> .hg/hgrc
464 > [extensions]
464 > [extensions]
465 > mq =
465 > mq =
466 > EOF
466 > EOF
467
467
468 >>> import os
468 >>> import os
469 >>> from hgclient import readchannel, runcommand, check
469 >>> from hgclient import readchannel, runcommand, check
470 >>> @check
470 >>> @check
471 ... def mqoutsidechanges(server):
471 ... def mqoutsidechanges(server):
472 ... readchannel(server)
472 ... readchannel(server)
473 ...
473 ...
474 ... # load repo.mq
474 ... # load repo.mq
475 ... runcommand(server, ['qapplied'])
475 ... runcommand(server, ['qapplied'])
476 ... os.system('hg qnew 0.diff')
476 ... os.system('hg qnew 0.diff')
477 ... # repo.mq should be invalidated
477 ... # repo.mq should be invalidated
478 ... runcommand(server, ['qapplied'])
478 ... runcommand(server, ['qapplied'])
479 ...
479 ...
480 ... runcommand(server, ['qpop', '--all'])
480 ... runcommand(server, ['qpop', '--all'])
481 ... os.system('hg qqueue --create foo')
481 ... os.system('hg qqueue --create foo')
482 ... # repo.mq should be recreated to point to new queue
482 ... # repo.mq should be recreated to point to new queue
483 ... runcommand(server, ['qqueue', '--active'])
483 ... runcommand(server, ['qqueue', '--active'])
484 runcommand qapplied
484 *** runcommand qapplied
485 runcommand qapplied
485 *** runcommand qapplied
486 0.diff
486 0.diff
487 runcommand qpop --all
487 *** runcommand qpop --all
488 popping 0.diff
488 popping 0.diff
489 patch queue now empty
489 patch queue now empty
490 runcommand qqueue --active
490 *** runcommand qqueue --active
491 foo
491 foo
492
492
493 $ cat <<EOF > dbgui.py
493 $ cat <<EOF > dbgui.py
494 > from mercurial import cmdutil, commands
494 > from mercurial import cmdutil, commands
495 > cmdtable = {}
495 > cmdtable = {}
496 > command = cmdutil.command(cmdtable)
496 > command = cmdutil.command(cmdtable)
497 > @command("debuggetpass", norepo=True)
497 > @command("debuggetpass", norepo=True)
498 > def debuggetpass(ui):
498 > def debuggetpass(ui):
499 > ui.write("%s\\n" % ui.getpass())
499 > ui.write("%s\\n" % ui.getpass())
500 > EOF
500 > EOF
501 $ cat <<EOF >> .hg/hgrc
501 $ cat <<EOF >> .hg/hgrc
502 > [extensions]
502 > [extensions]
503 > dbgui = dbgui.py
503 > dbgui = dbgui.py
504 > EOF
504 > EOF
505
505
506 >>> import cStringIO
506 >>> import cStringIO
507 >>> from hgclient import readchannel, runcommand, check
507 >>> from hgclient import readchannel, runcommand, check
508 >>> @check
508 >>> @check
509 ... def getpass(server):
509 ... def getpass(server):
510 ... readchannel(server)
510 ... readchannel(server)
511 ... runcommand(server, ['debuggetpass', '--config',
511 ... runcommand(server, ['debuggetpass', '--config',
512 ... 'ui.interactive=True'],
512 ... 'ui.interactive=True'],
513 ... input=cStringIO.StringIO('1234\n'))
513 ... input=cStringIO.StringIO('1234\n'))
514 runcommand debuggetpass --config ui.interactive=True
514 *** runcommand debuggetpass --config ui.interactive=True
515 password: 1234
515 password: 1234
516
516
517
517
518 start without repository:
518 start without repository:
519
519
520 $ cd ..
520 $ cd ..
521
521
522 >>> from hgclient import readchannel, runcommand, check
522 >>> from hgclient import readchannel, runcommand, check
523 >>> @check
523 >>> @check
524 ... def hellomessage(server):
524 ... def hellomessage(server):
525 ... ch, data = readchannel(server)
525 ... ch, data = readchannel(server)
526 ... print '%c, %r' % (ch, data)
526 ... print '%c, %r' % (ch, data)
527 ... # run an arbitrary command to make sure the next thing the server
527 ... # run an arbitrary command to make sure the next thing the server
528 ... # sends isn't part of the hello message
528 ... # sends isn't part of the hello message
529 ... runcommand(server, ['id'])
529 ... runcommand(server, ['id'])
530 o, 'capabilities: getencoding runcommand\nencoding: *' (glob)
530 o, 'capabilities: getencoding runcommand\nencoding: *' (glob)
531 runcommand id
531 *** runcommand id
532 abort: there is no Mercurial repository here (.hg not found)
532 abort: there is no Mercurial repository here (.hg not found)
533 [255]
533 [255]
534
534
535 >>> from hgclient import readchannel, runcommand, check
535 >>> from hgclient import readchannel, runcommand, check
536 >>> @check
536 >>> @check
537 ... def startwithoutrepo(server):
537 ... def startwithoutrepo(server):
538 ... readchannel(server)
538 ... readchannel(server)
539 ... runcommand(server, ['init', 'repo2'])
539 ... runcommand(server, ['init', 'repo2'])
540 ... runcommand(server, ['id', '-R', 'repo2'])
540 ... runcommand(server, ['id', '-R', 'repo2'])
541 runcommand init repo2
541 *** runcommand init repo2
542 runcommand id -R repo2
542 *** runcommand id -R repo2
543 000000000000 tip
543 000000000000 tip
General Comments 0
You need to be logged in to leave comments. Login now