1 Test basic extension support |
1 Test basic extension support |
2 |
2 |
3 $ cat > foobar.py <<EOF |
3 $ cat > foobar.py <<EOF |
4 > import os |
4 > import os |
5 > from mercurial import cmdutil, commands |
5 > from mercurial import cmdutil, commands |
6 > |
|
7 > cmdtable = {} |
6 > cmdtable = {} |
8 > command = cmdutil.command(cmdtable) |
7 > command = cmdutil.command(cmdtable) |
9 > |
|
10 > def uisetup(ui): |
8 > def uisetup(ui): |
11 > ui.write("uisetup called\\n") |
9 > ui.write("uisetup called\\n") |
12 > |
|
13 > def reposetup(ui, repo): |
10 > def reposetup(ui, repo): |
14 > ui.write("reposetup called for %s\\n" % os.path.basename(repo.root)) |
11 > ui.write("reposetup called for %s\\n" % os.path.basename(repo.root)) |
15 > ui.write("ui %s= repo.ui\\n" % (ui == repo.ui and "=" or "!")) |
12 > ui.write("ui %s= repo.ui\\n" % (ui == repo.ui and "=" or "!")) |
16 > |
|
17 > @command('foo', [], 'hg foo') |
13 > @command('foo', [], 'hg foo') |
18 > def foo(ui, *args, **kwargs): |
14 > def foo(ui, *args, **kwargs): |
19 > ui.write("Foo\\n") |
15 > ui.write("Foo\\n") |
20 > |
|
21 > @command('bar', [], 'hg bar', norepo=True) |
16 > @command('bar', [], 'hg bar', norepo=True) |
22 > def bar(ui, *args, **kwargs): |
17 > def bar(ui, *args, **kwargs): |
23 > ui.write("Bar\\n") |
18 > ui.write("Bar\\n") |
24 > |
|
25 > EOF |
19 > EOF |
26 $ abspath=`pwd`/foobar.py |
20 $ abspath=`pwd`/foobar.py |
27 |
21 |
28 $ mkdir barfoo |
22 $ mkdir barfoo |
29 $ cp foobar.py barfoo/__init__.py |
23 $ cp foobar.py barfoo/__init__.py |
104 $ cat > hgweb.cgi <<EOF |
98 $ cat > hgweb.cgi <<EOF |
105 > #!/usr/bin/env python |
99 > #!/usr/bin/env python |
106 > from mercurial import demandimport; demandimport.enable() |
100 > from mercurial import demandimport; demandimport.enable() |
107 > from mercurial.hgweb import hgweb |
101 > from mercurial.hgweb import hgweb |
108 > from mercurial.hgweb import wsgicgi |
102 > from mercurial.hgweb import wsgicgi |
109 > |
|
110 > application = hgweb('.', 'test repo') |
103 > application = hgweb('.', 'test repo') |
111 > wsgicgi.launch(application) |
104 > wsgicgi.launch(application) |
112 > EOF |
105 > EOF |
113 |
106 |
114 $ REQUEST_METHOD='GET' PATH_INFO='/' SCRIPT_NAME='' QUERY_STRING='' \ |
107 $ REQUEST_METHOD='GET' PATH_INFO='/' SCRIPT_NAME='' QUERY_STRING='' \ |
199 > buf = [] |
192 > buf = [] |
200 > def func(): |
193 > def func(): |
201 > # "not locals" case |
194 > # "not locals" case |
202 > import extroot.bar |
195 > import extroot.bar |
203 > buf.append('import extroot.bar in func(): %s' % extroot.bar.s) |
196 > buf.append('import extroot.bar in func(): %s' % extroot.bar.s) |
204 > |
|
205 > return '\n(extroot) '.join(buf) |
197 > return '\n(extroot) '.join(buf) |
206 > |
|
207 > # "fromlist == ('*',)" case |
198 > # "fromlist == ('*',)" case |
208 > from extroot.bar import * |
199 > from extroot.bar import * |
209 > buf.append('from extroot.bar import *: %s' % s) |
200 > buf.append('from extroot.bar import *: %s' % s) |
210 > |
|
211 > # "not fromlist" and "if '.' in name" case |
201 > # "not fromlist" and "if '.' in name" case |
212 > import extroot.sub1.baz |
202 > import extroot.sub1.baz |
213 > buf.append('import extroot.sub1.baz: %s' % extroot.sub1.baz.s) |
203 > buf.append('import extroot.sub1.baz: %s' % extroot.sub1.baz.s) |
214 > |
|
215 > # "not fromlist" and NOT "if '.' in name" case |
204 > # "not fromlist" and NOT "if '.' in name" case |
216 > import extroot |
205 > import extroot |
217 > buf.append('import extroot: %s' % extroot.s) |
206 > buf.append('import extroot: %s' % extroot.s) |
218 > |
|
219 > # NOT "not fromlist" and NOT "level != -1" case |
207 > # NOT "not fromlist" and NOT "level != -1" case |
220 > from extroot.bar import s |
208 > from extroot.bar import s |
221 > buf.append('from extroot.bar import s: %s' % s) |
209 > buf.append('from extroot.bar import s: %s' % s) |
222 > EOF |
210 > EOF |
223 $ hg --config extensions.extroot=$TESTTMP/extroot root |
211 $ hg --config extensions.extroot=$TESTTMP/extroot root |
235 > buf = [] |
223 > buf = [] |
236 > def func(): |
224 > def func(): |
237 > # "not locals" case |
225 > # "not locals" case |
238 > import bar |
226 > import bar |
239 > buf.append('import bar in func(): %s' % bar.s) |
227 > buf.append('import bar in func(): %s' % bar.s) |
240 > |
|
241 > return '\n(extroot) '.join(buf) |
228 > return '\n(extroot) '.join(buf) |
242 > |
|
243 > # "fromlist == ('*',)" case |
229 > # "fromlist == ('*',)" case |
244 > from bar import * |
230 > from bar import * |
245 > buf.append('from bar import *: %s' % s) |
231 > buf.append('from bar import *: %s' % s) |
246 > |
|
247 > # "not fromlist" and "if '.' in name" case |
232 > # "not fromlist" and "if '.' in name" case |
248 > import sub1.baz |
233 > import sub1.baz |
249 > buf.append('import sub1.baz: %s' % sub1.baz.s) |
234 > buf.append('import sub1.baz: %s' % sub1.baz.s) |
250 > |
|
251 > # "not fromlist" and NOT "if '.' in name" case |
235 > # "not fromlist" and NOT "if '.' in name" case |
252 > import sub1 |
236 > import sub1 |
253 > buf.append('import sub1: %s' % sub1.s) |
237 > buf.append('import sub1: %s' % sub1.s) |
254 > |
|
255 > # NOT "not fromlist" and NOT "level != -1" case |
238 > # NOT "not fromlist" and NOT "level != -1" case |
256 > from bar import s |
239 > from bar import s |
257 > buf.append('from bar import s: %s' % s) |
240 > buf.append('from bar import s: %s' % s) |
258 > EOF |
241 > EOF |
259 $ hg --config extensions.extroot=$TESTTMP/extroot root |
242 $ hg --config extensions.extroot=$TESTTMP/extroot root |
280 $ hg help empty |
263 $ hg help empty |
281 empty extension - empty cmdtable |
264 empty extension - empty cmdtable |
282 |
265 |
283 no commands defined |
266 no commands defined |
284 |
267 |
|
268 |
285 $ echo 'empty = !' >> $HGRCPATH |
269 $ echo 'empty = !' >> $HGRCPATH |
286 |
270 |
287 $ cat > debugextension.py <<EOF |
271 $ cat > debugextension.py <<EOF |
288 > '''only debugcommands |
272 > '''only debugcommands |
289 > ''' |
273 > ''' |
290 > from mercurial import cmdutil |
274 > from mercurial import cmdutil |
291 > cmdtable = {} |
275 > cmdtable = {} |
292 > command = cmdutil.command(cmdtable) |
276 > command = cmdutil.command(cmdtable) |
293 > |
|
294 > @command('debugfoobar', [], 'hg debugfoobar') |
277 > @command('debugfoobar', [], 'hg debugfoobar') |
295 > def debugfoobar(ui, repo, *args, **opts): |
278 > def debugfoobar(ui, repo, *args, **opts): |
296 > "yet another debug command" |
279 > "yet another debug command" |
297 > pass |
280 > pass |
298 > |
|
299 > @command('foo', [], 'hg foo') |
281 > @command('foo', [], 'hg foo') |
300 > def foo(ui, repo, *args, **opts): |
282 > def foo(ui, repo, *args, **opts): |
301 > """yet another foo command |
283 > """yet another foo command |
302 > |
|
303 > This command has been DEPRECATED since forever. |
284 > This command has been DEPRECATED since forever. |
304 > """ |
285 > """ |
305 > pass |
286 > pass |
306 > EOF |
287 > EOF |
307 $ debugpath=`pwd`/debugextension.py |
288 $ debugpath=`pwd`/debugextension.py |
340 -h --help display help and exit |
322 -h --help display help and exit |
341 --hidden consider hidden changesets |
323 --hidden consider hidden changesets |
342 |
324 |
343 [+] marked option can be specified multiple times |
325 [+] marked option can be specified multiple times |
344 |
326 |
|
327 |
|
328 |
|
329 |
|
330 |
|
331 |
345 $ hg --debug help debugextension |
332 $ hg --debug help debugextension |
346 debugextension extension - only debugcommands |
333 debugextension extension - only debugcommands |
347 |
334 |
348 list of commands: |
335 list of commands: |
349 |
336 |
370 --version output version information and exit |
357 --version output version information and exit |
371 -h --help display help and exit |
358 -h --help display help and exit |
372 --hidden consider hidden changesets |
359 --hidden consider hidden changesets |
373 |
360 |
374 [+] marked option can be specified multiple times |
361 [+] marked option can be specified multiple times |
|
362 |
|
363 |
|
364 |
|
365 |
|
366 |
375 $ echo 'debugextension = !' >> $HGRCPATH |
367 $ echo 'debugextension = !' >> $HGRCPATH |
376 |
368 |
377 Extension module help vs command help: |
369 Extension module help vs command help: |
378 |
370 |
379 $ echo 'extdiff =' >> $HGRCPATH |
371 $ echo 'extdiff =' >> $HGRCPATH |
409 |
401 |
410 [+] marked option can be specified multiple times |
402 [+] marked option can be specified multiple times |
411 |
403 |
412 use "hg -v help extdiff" to show the global options |
404 use "hg -v help extdiff" to show the global options |
413 |
405 |
|
406 |
|
407 |
|
408 |
|
409 |
|
410 |
|
411 |
|
412 |
|
413 |
|
414 |
414 $ hg help --extension extdiff |
415 $ hg help --extension extdiff |
415 extdiff extension - command to allow external programs to compare revisions |
416 extdiff extension - command to allow external programs to compare revisions |
416 |
417 |
417 The extdiff Mercurial extension allows you to use external programs to compare |
418 The extdiff Mercurial extension allows you to use external programs to compare |
418 revisions, or revision with working directory. The external diff programs are |
419 revisions, or revision with working directory. The external diff programs are |
505 A range acts as a closed interval. This means that a range of 3:5 gives 3, |
521 A range acts as a closed interval. This means that a range of 3:5 gives 3, |
506 4 and 5. Similarly, a range of 9:6 gives 9, 8, 7, and 6. |
522 4 and 5. Similarly, a range of 9:6 gives 9, 8, 7, and 6. |
507 |
523 |
508 use "hg help -c multirevs" to see help for the multirevs command |
524 use "hg help -c multirevs" to see help for the multirevs command |
509 |
525 |
|
526 |
|
527 |
|
528 |
|
529 |
|
530 |
510 $ hg help -c multirevs |
531 $ hg help -c multirevs |
511 hg multirevs ARG |
532 hg multirevs ARG |
512 |
533 |
513 multirevs command |
534 multirevs command |
514 |
535 |
515 use "hg -v help multirevs" to show the global options |
536 use "hg -v help multirevs" to show the global options |
|
537 |
|
538 |
516 |
539 |
517 $ hg multirevs |
540 $ hg multirevs |
518 hg multirevs: invalid arguments |
541 hg multirevs: invalid arguments |
519 hg multirevs ARG |
542 hg multirevs ARG |
520 |
543 |
521 multirevs command |
544 multirevs command |
522 |
545 |
523 use "hg help multirevs" to show the full help text |
546 use "hg help multirevs" to show the full help text |
524 [255] |
547 [255] |
|
548 |
|
549 |
525 |
550 |
526 $ echo "multirevs = !" >> $HGRCPATH |
551 $ echo "multirevs = !" >> $HGRCPATH |
527 |
552 |
528 Issue811: Problem loading extensions twice (by site and by user) |
553 Issue811: Problem loading extensions twice (by site and by user) |
529 |
554 |
532 > '''show all loaded extensions |
557 > '''show all loaded extensions |
533 > ''' |
558 > ''' |
534 > from mercurial import cmdutil, commands, extensions |
559 > from mercurial import cmdutil, commands, extensions |
535 > cmdtable = {} |
560 > cmdtable = {} |
536 > command = cmdutil.command(cmdtable) |
561 > command = cmdutil.command(cmdtable) |
537 > |
|
538 > @command('debugextensions', [], 'hg debugextensions', norepo=True) |
562 > @command('debugextensions', [], 'hg debugextensions', norepo=True) |
539 > def debugextensions(ui): |
563 > def debugextensions(ui): |
540 > "yet another debug command" |
564 > "yet another debug command" |
541 > ui.write("%s\n" % '\n'.join([x for x, y in extensions.extensions()])) |
565 > ui.write("%s\n" % '\n'.join([x for x, y in extensions.extensions()])) |
542 > |
|
543 > EOF |
566 > EOF |
544 $ echo "debugissue811 = $debugpath" >> $HGRCPATH |
567 $ echo "debugissue811 = $debugpath" >> $HGRCPATH |
545 $ echo "mq=" >> $HGRCPATH |
568 $ echo "mq=" >> $HGRCPATH |
546 $ echo "strip=" >> $HGRCPATH |
569 $ echo "strip=" >> $HGRCPATH |
547 $ echo "hgext.mq=" >> $HGRCPATH |
570 $ echo "hgext.mq=" >> $HGRCPATH |
564 'email' is provided by the following extension: |
587 'email' is provided by the following extension: |
565 |
588 |
566 patchbomb command to send changesets as (a series of) patch emails |
589 patchbomb command to send changesets as (a series of) patch emails |
567 |
590 |
568 use "hg help extensions" for information on enabling extensions |
591 use "hg help extensions" for information on enabling extensions |
|
592 |
|
593 |
569 $ hg qdel |
594 $ hg qdel |
570 hg: unknown command 'qdel' |
595 hg: unknown command 'qdel' |
571 'qdelete' is provided by the following extension: |
596 'qdelete' is provided by the following extension: |
572 |
597 |
573 mq manage a stack of patches |
598 mq manage a stack of patches |
574 |
599 |
575 use "hg help extensions" for information on enabling extensions |
600 use "hg help extensions" for information on enabling extensions |
576 [255] |
601 [255] |
|
602 |
|
603 |
577 $ hg churn |
604 $ hg churn |
578 hg: unknown command 'churn' |
605 hg: unknown command 'churn' |
579 'churn' is provided by the following extension: |
606 'churn' is provided by the following extension: |
580 |
607 |
581 churn command to display statistics about repository history |
608 churn command to display statistics about repository history |
582 |
609 |
583 use "hg help extensions" for information on enabling extensions |
610 use "hg help extensions" for information on enabling extensions |
584 [255] |
611 [255] |
585 |
612 |
|
613 |
|
614 |
586 Disabled extensions: |
615 Disabled extensions: |
587 |
616 |
588 $ hg help churn |
617 $ hg help churn |
589 churn extension - command to display statistics about repository history |
618 churn extension - command to display statistics about repository history |
590 |
619 |
591 use "hg help extensions" for information on enabling extensions |
620 use "hg help extensions" for information on enabling extensions |
|
621 |
592 $ hg help patchbomb |
622 $ hg help patchbomb |
593 patchbomb extension - command to send changesets as (a series of) patch emails |
623 patchbomb extension - command to send changesets as (a series of) patch emails |
594 |
624 |
595 use "hg help extensions" for information on enabling extensions |
625 use "hg help extensions" for information on enabling extensions |
|
626 |
596 |
627 |
597 Broken disabled extension and command: |
628 Broken disabled extension and command: |
598 |
629 |
599 $ mkdir hgext |
630 $ mkdir hgext |
600 $ echo > hgext/__init__.py |
631 $ echo > hgext/__init__.py |
610 |
641 |
611 $ hg --config extensions.path=./path.py help broken |
642 $ hg --config extensions.path=./path.py help broken |
612 broken extension - (no help text available) |
643 broken extension - (no help text available) |
613 |
644 |
614 use "hg help extensions" for information on enabling extensions |
645 use "hg help extensions" for information on enabling extensions |
|
646 |
615 |
647 |
616 $ cat > hgext/forest.py <<EOF |
648 $ cat > hgext/forest.py <<EOF |
617 > cmdtable = None |
649 > cmdtable = None |
618 > EOF |
650 > EOF |
619 $ hg --config extensions.path=./path.py help foo > /dev/null |
651 $ hg --config extensions.path=./path.py help foo > /dev/null |
625 $ cat > throw.py <<EOF |
657 $ cat > throw.py <<EOF |
626 > from mercurial import cmdutil, commands |
658 > from mercurial import cmdutil, commands |
627 > cmdtable = {} |
659 > cmdtable = {} |
628 > command = cmdutil.command(cmdtable) |
660 > command = cmdutil.command(cmdtable) |
629 > class Bogon(Exception): pass |
661 > class Bogon(Exception): pass |
630 > |
|
631 > @command('throw', [], 'hg throw', norepo=True) |
662 > @command('throw', [], 'hg throw', norepo=True) |
632 > def throw(ui, **opts): |
663 > def throw(ui, **opts): |
633 > """throws an exception""" |
664 > """throws an exception""" |
634 > raise Bogon() |
665 > raise Bogon() |
635 > EOF |
666 > EOF |
712 ** http://mercurial.selenic.com/wiki/BugTracker |
743 ** http://mercurial.selenic.com/wiki/BugTracker |
713 ** Python * (glob) |
744 ** Python * (glob) |
714 ** Mercurial Distributed SCM (*) (glob) |
745 ** Mercurial Distributed SCM (*) (glob) |
715 ** Extensions loaded: throw |
746 ** Extensions loaded: throw |
716 |
747 |
|
748 Test version number support in 'hg version': |
|
749 $ echo '__version__ = (1, 2, 3)' >> throw.py |
|
750 $ rm -f throw.pyc throw.pyo |
|
751 $ hg version -v --config extensions.throw=throw.py |
|
752 Mercurial Distributed SCM (version *) (glob) |
|
753 (see http://mercurial.selenic.com for more information) |
|
754 |
|
755 Copyright (C) 2005-* Matt Mackall and others (glob) |
|
756 This is free software; see the source for copying conditions. There is NO |
|
757 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
|
758 |
|
759 Enabled extensions: |
|
760 |
|
761 throw 1.2.3 |
|
762 $ echo 'getversion = lambda: "1.twentythree"' >> throw.py |
|
763 $ rm -f throw.pyc throw.pyo |
|
764 $ hg version -v --config extensions.throw=throw.py |
|
765 Mercurial Distributed SCM (version *) (glob) |
|
766 (see http://mercurial.selenic.com for more information) |
|
767 |
|
768 Copyright (C) 2005-* Matt Mackall and others (glob) |
|
769 This is free software; see the source for copying conditions. There is NO |
|
770 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
|
771 |
|
772 Enabled extensions: |
|
773 |
|
774 throw 1.twentythree |
|
775 |
717 Restore HGRCPATH |
776 Restore HGRCPATH |
718 |
777 |
719 $ HGRCPATH=$ORGHGRCPATH |
778 $ HGRCPATH=$ORGHGRCPATH |
720 $ export HGRCPATH |
779 $ export HGRCPATH |
721 |
780 |