Show More
@@ -429,10 +429,6 b' int main(int argc, const char *argv[], c' | |||||
429 | } |
|
429 | } | |
430 |
|
430 | |||
431 | setupsignalhandler(hgc_peerpid(hgc), hgc_peerpgid(hgc)); |
|
431 | setupsignalhandler(hgc_peerpid(hgc), hgc_peerpgid(hgc)); | |
432 | const char *pagercmd = hgc_getpager(hgc, argv + 1, argc - 1); |
|
|||
433 | pid_t pagerpid = setuppager(pagercmd); |
|
|||
434 | if (pagerpid) |
|
|||
435 | hgc_attachio(hgc); /* reattach to pager */ |
|
|||
436 | int exitcode = hgc_runcommand(hgc, argv + 1, argc - 1); |
|
432 | int exitcode = hgc_runcommand(hgc, argv + 1, argc - 1); | |
437 | restoresignalhandler(); |
|
433 | restoresignalhandler(); | |
438 | hgc_close(hgc); |
|
434 | hgc_close(hgc); |
@@ -32,7 +32,6 b' enum {' | |||||
32 | /* cHg extension: */ |
|
32 | /* cHg extension: */ | |
33 | CAP_ATTACHIO = 0x0100, |
|
33 | CAP_ATTACHIO = 0x0100, | |
34 | CAP_CHDIR = 0x0200, |
|
34 | CAP_CHDIR = 0x0200, | |
35 | CAP_GETPAGER = 0x0400, |
|
|||
36 | CAP_SETENV = 0x0800, |
|
35 | CAP_SETENV = 0x0800, | |
37 | CAP_SETUMASK = 0x1000, |
|
36 | CAP_SETUMASK = 0x1000, | |
38 | CAP_VALIDATE = 0x2000, |
|
37 | CAP_VALIDATE = 0x2000, | |
@@ -48,7 +47,6 b' static const cappair_t captable[] = {' | |||||
48 | {"runcommand", CAP_RUNCOMMAND}, |
|
47 | {"runcommand", CAP_RUNCOMMAND}, | |
49 | {"attachio", CAP_ATTACHIO}, |
|
48 | {"attachio", CAP_ATTACHIO}, | |
50 | {"chdir", CAP_CHDIR}, |
|
49 | {"chdir", CAP_CHDIR}, | |
51 | {"getpager", CAP_GETPAGER}, |
|
|||
52 | {"setenv", CAP_SETENV}, |
|
50 | {"setenv", CAP_SETENV}, | |
53 | {"setumask", CAP_SETUMASK}, |
|
51 | {"setumask", CAP_SETUMASK}, | |
54 | {"validate", CAP_VALIDATE}, |
|
52 | {"validate", CAP_VALIDATE}, | |
@@ -593,31 +591,6 b' void hgc_attachio(hgclient_t *hgc)' | |||||
593 | } |
|
591 | } | |
594 |
|
592 | |||
595 | /*! |
|
593 | /*! | |
596 | * Get pager command for the given Mercurial command args |
|
|||
597 | * |
|
|||
598 | * If no pager enabled, returns NULL. The return value becomes invalid |
|
|||
599 | * once you run another request to hgc. |
|
|||
600 | */ |
|
|||
601 | const char *hgc_getpager(hgclient_t *hgc, const char *const args[], |
|
|||
602 | size_t argsize) |
|
|||
603 | { |
|
|||
604 | assert(hgc); |
|
|||
605 |
|
||||
606 | if (!(hgc->capflags & CAP_GETPAGER)) |
|
|||
607 | return NULL; |
|
|||
608 |
|
||||
609 | packcmdargs(&hgc->ctx, args, argsize); |
|
|||
610 | writeblockrequest(hgc, "getpager"); |
|
|||
611 | handleresponse(hgc); |
|
|||
612 |
|
||||
613 | if (hgc->ctx.datasize < 1 || hgc->ctx.data[0] == '\0') |
|
|||
614 | return NULL; |
|
|||
615 | enlargecontext(&hgc->ctx, hgc->ctx.datasize + 1); |
|
|||
616 | hgc->ctx.data[hgc->ctx.datasize] = '\0'; |
|
|||
617 | return hgc->ctx.data; |
|
|||
618 | } |
|
|||
619 |
|
||||
620 | /*! |
|
|||
621 | * Update server's environment variables |
|
594 | * Update server's environment variables | |
622 | * |
|
595 | * | |
623 | * @param envp list of environment variables in "NAME=VALUE" format, |
|
596 | * @param envp list of environment variables in "NAME=VALUE" format, |
@@ -25,8 +25,6 b' const char **hgc_validate(hgclient_t *hg' | |||||
25 | size_t argsize); |
|
25 | size_t argsize); | |
26 | int hgc_runcommand(hgclient_t *hgc, const char *const args[], size_t argsize); |
|
26 | int hgc_runcommand(hgclient_t *hgc, const char *const args[], size_t argsize); | |
27 | void hgc_attachio(hgclient_t *hgc); |
|
27 | void hgc_attachio(hgclient_t *hgc); | |
28 | const char *hgc_getpager(hgclient_t *hgc, const char *const args[], |
|
|||
29 | size_t argsize); |
|
|||
30 | void hgc_setenv(hgclient_t *hgc, const char *const envp[]); |
|
28 | void hgc_setenv(hgclient_t *hgc, const char *const envp[]); | |
31 |
|
29 | |||
32 | #endif /* HGCLIENT_H_ */ |
|
30 | #endif /* HGCLIENT_H_ */ |
@@ -16,9 +16,6 b'' | |||||
16 | 'chdir' command |
|
16 | 'chdir' command | |
17 | change current directory |
|
17 | change current directory | |
18 |
|
18 | |||
19 | 'getpager' command |
|
|||
20 | checks if pager is enabled and which pager should be executed |
|
|||
21 |
|
||||
22 | 'setenv' command |
|
19 | 'setenv' command | |
23 | replace os.environ completely |
|
20 | replace os.environ completely | |
24 |
|
21 | |||
@@ -45,14 +42,12 b' import hashlib' | |||||
45 | import inspect |
|
42 | import inspect | |
46 | import os |
|
43 | import os | |
47 | import re |
|
44 | import re | |
48 | import signal |
|
|||
49 | import struct |
|
45 | import struct | |
50 | import time |
|
46 | import time | |
51 |
|
47 | |||
52 | from .i18n import _ |
|
48 | from .i18n import _ | |
53 |
|
49 | |||
54 | from . import ( |
|
50 | from . import ( | |
55 | cmdutil, |
|
|||
56 | commandserver, |
|
51 | commandserver, | |
57 | encoding, |
|
52 | encoding, | |
58 | error, |
|
53 | error, | |
@@ -172,45 +167,6 b' class hashstate(object):' | |||||
172 | _log('confighash = %s mtimehash = %s\n' % (confighash, mtimehash)) |
|
167 | _log('confighash = %s mtimehash = %s\n' % (confighash, mtimehash)) | |
173 | return hashstate(confighash, mtimehash, mtimepaths) |
|
168 | return hashstate(confighash, mtimehash, mtimepaths) | |
174 |
|
169 | |||
175 | # copied from hgext/pager.py:uisetup() |
|
|||
176 | def _setuppagercmd(ui, options, cmd): |
|
|||
177 | from . import commands # avoid cycle |
|
|||
178 |
|
||||
179 | if not ui.formatted(): |
|
|||
180 | return |
|
|||
181 |
|
||||
182 | p = ui.config("pager", "pager", encoding.environ.get("PAGER")) |
|
|||
183 | usepager = False |
|
|||
184 | always = util.parsebool(options['pager']) |
|
|||
185 | auto = options['pager'] == 'auto' |
|
|||
186 |
|
||||
187 | if not p: |
|
|||
188 | pass |
|
|||
189 | elif always: |
|
|||
190 | usepager = True |
|
|||
191 | elif not auto: |
|
|||
192 | usepager = False |
|
|||
193 | else: |
|
|||
194 | attended = ['annotate', 'cat', 'diff', 'export', 'glog', 'log', 'qdiff'] |
|
|||
195 | attend = ui.configlist('pager', 'attend', attended) |
|
|||
196 | ignore = ui.configlist('pager', 'ignore') |
|
|||
197 | cmds, _ = cmdutil.findcmd(cmd, commands.table) |
|
|||
198 |
|
||||
199 | for cmd in cmds: |
|
|||
200 | var = 'attend-%s' % cmd |
|
|||
201 | if ui.config('pager', var): |
|
|||
202 | usepager = ui.configbool('pager', var) |
|
|||
203 | break |
|
|||
204 | if (cmd in attend or |
|
|||
205 | (cmd not in ignore and not attend)): |
|
|||
206 | usepager = True |
|
|||
207 | break |
|
|||
208 |
|
||||
209 | if usepager: |
|
|||
210 | ui.setconfig('ui', 'formatted', ui.formatted(), 'pager') |
|
|||
211 | ui.setconfig('ui', 'interactive', False, 'pager') |
|
|||
212 | return p |
|
|||
213 |
|
||||
214 | def _newchgui(srcui, csystem, attachio): |
|
170 | def _newchgui(srcui, csystem, attachio): | |
215 | class chgui(srcui.__class__): |
|
171 | class chgui(srcui.__class__): | |
216 | def __init__(self, src=None): |
|
172 | def __init__(self, src=None): | |
@@ -484,37 +440,6 b' class chgcmdserver(commandserver.server)' | |||||
484 | _log('setumask %r\n' % mask) |
|
440 | _log('setumask %r\n' % mask) | |
485 | os.umask(mask) |
|
441 | os.umask(mask) | |
486 |
|
442 | |||
487 | def getpager(self): |
|
|||
488 | """Read cmdargs and write pager command to r-channel if enabled |
|
|||
489 |
|
||||
490 | If pager isn't enabled, this writes '\0' because channeledoutput |
|
|||
491 | does not allow to write empty data. |
|
|||
492 | """ |
|
|||
493 | from . import dispatch # avoid cycle |
|
|||
494 |
|
||||
495 | args = self._readlist() |
|
|||
496 | try: |
|
|||
497 | cmd, _func, args, options, _cmdoptions = dispatch._parse(self.ui, |
|
|||
498 | args) |
|
|||
499 | except (error.Abort, error.AmbiguousCommand, error.CommandError, |
|
|||
500 | error.UnknownCommand): |
|
|||
501 | cmd = None |
|
|||
502 | options = {} |
|
|||
503 | if not cmd or 'pager' not in options: |
|
|||
504 | self.cresult.write('\0') |
|
|||
505 | return |
|
|||
506 |
|
||||
507 | pagercmd = _setuppagercmd(self.ui, options, cmd) |
|
|||
508 | if pagercmd: |
|
|||
509 | # Python's SIGPIPE is SIG_IGN by default. change to SIG_DFL so |
|
|||
510 | # we can exit if the pipe to the pager is closed |
|
|||
511 | if util.safehasattr(signal, 'SIGPIPE') and \ |
|
|||
512 | signal.getsignal(signal.SIGPIPE) == signal.SIG_IGN: |
|
|||
513 | signal.signal(signal.SIGPIPE, signal.SIG_DFL) |
|
|||
514 | self.cresult.write(pagercmd) |
|
|||
515 | else: |
|
|||
516 | self.cresult.write('\0') |
|
|||
517 |
|
||||
518 | def runcommand(self): |
|
443 | def runcommand(self): | |
519 | return super(chgcmdserver, self).runcommand() |
|
444 | return super(chgcmdserver, self).runcommand() | |
520 |
|
445 | |||
@@ -535,7 +460,6 b' class chgcmdserver(commandserver.server)' | |||||
535 | capabilities = commandserver.server.capabilities.copy() |
|
460 | capabilities = commandserver.server.capabilities.copy() | |
536 | capabilities.update({'attachio': attachio, |
|
461 | capabilities.update({'attachio': attachio, | |
537 | 'chdir': chdir, |
|
462 | 'chdir': chdir, | |
538 | 'getpager': getpager, |
|
|||
539 | 'runcommand': runcommand, |
|
463 | 'runcommand': runcommand, | |
540 | 'setenv': setenv, |
|
464 | 'setenv': setenv, | |
541 | 'setumask': setumask}) |
|
465 | 'setumask': setumask}) |
General Comments 0
You need to be logged in to leave comments.
Login now