Mercurial > public > mercurial-scm > hg
annotate mercurial/configuration/command.py @ 52419:04c3fb885fb6
config: extra the code showing config in its own module too
This conclude our extract of the main semantic in a dedicated module.
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Mon, 21 Oct 2024 14:30:50 +0200 |
parents | e98cea8fc858 |
children | 3e79ca017157 |
rev | line source |
---|---|
52417
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
1 # Gather code related to command dealing with configuration. |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
2 |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
3 from __future__ import annotations |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
4 |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
5 import os |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
6 |
52419
04c3fb885fb6
config: extra the code showing config in its own module too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52418
diff
changeset
|
7 from typing import Any, Collection, Dict, Optional |
52417
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
8 |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
9 from ..i18n import _ |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
10 |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
11 from .. import ( |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
12 cmdutil, |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
13 error, |
52419
04c3fb885fb6
config: extra the code showing config in its own module too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52418
diff
changeset
|
14 formatter, |
04c3fb885fb6
config: extra the code showing config in its own module too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52418
diff
changeset
|
15 pycompat, |
52417
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
16 requirements, |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
17 ui as uimod, |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
18 util, |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
19 vfs as vfsmod, |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
20 ) |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
21 |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
22 from . import rcutil |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
23 |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
24 EDIT_FLAG = 'edit' |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
25 |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
26 |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
27 # keep typing simple for now |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
28 ConfigLevelT = str |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
29 LEVEL_USER = 'user' # "user" is the default level and never passed explicitly |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
30 LEVEL_LOCAL = 'local' |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
31 LEVEL_GLOBAL = 'global' |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
32 LEVEL_SHARED = 'shared' |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
33 LEVEL_NON_SHARED = 'non_shared' |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
34 EDIT_LEVELS = ( |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
35 LEVEL_USER, |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
36 LEVEL_LOCAL, |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
37 LEVEL_GLOBAL, |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
38 LEVEL_SHARED, |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
39 LEVEL_NON_SHARED, |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
40 ) |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
41 |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
42 |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
43 def find_edit_level( |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
44 ui: uimod.ui, repo, opts: Dict[str, Any] |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
45 ) -> Optional[ConfigLevelT]: |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
46 """return the level we should edit, if any. |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
47 |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
48 Parse the command option to detect when an edit is requested, and if so the |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
49 configuration level we should edit. |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
50 """ |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
51 if opts.get(EDIT_FLAG) or any(opts.get(o) for o in EDIT_LEVELS): |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
52 cmdutil.check_at_most_one_arg(opts, *EDIT_LEVELS) |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
53 for level in EDIT_LEVELS: |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
54 if opts.get(level): |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
55 return level |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
56 return EDIT_LEVELS[0] |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
57 return None |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
58 |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
59 |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
60 def edit_config(ui: uimod.ui, repo, level: ConfigLevelT) -> None: |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
61 """let the user edit configuration file for the given level""" |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
62 |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
63 if level == LEVEL_USER: |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
64 paths = rcutil.userrcpath() |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
65 elif level == LEVEL_GLOBAL: |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
66 paths = rcutil.systemrcpath() |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
67 elif level == LEVEL_LOCAL: |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
68 if not repo: |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
69 raise error.InputError(_(b"can't use --local outside a repository")) |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
70 paths = [repo.vfs.join(b'hgrc')] |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
71 elif level == LEVEL_NON_SHARED: |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
72 paths = [repo.vfs.join(b'hgrc-not-shared')] |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
73 elif level == LEVEL_SHARED: |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
74 if not repo.shared(): |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
75 raise error.InputError( |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
76 _(b"repository is not shared; can't use --shared") |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
77 ) |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
78 if requirements.SHARESAFE_REQUIREMENT not in repo.requirements: |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
79 raise error.InputError( |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
80 _( |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
81 b"share safe feature not enabled; " |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
82 b"unable to edit shared source repository config" |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
83 ) |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
84 ) |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
85 paths = [vfsmod.vfs(repo.sharedpath).join(b'hgrc')] |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
86 else: |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
87 msg = 'unknown config level: %s' % level |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
88 raise error.ProgrammingError(msg) |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
89 |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
90 for f in paths: |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
91 if os.path.exists(f): |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
92 break |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
93 else: |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
94 if LEVEL_GLOBAL: |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
95 samplehgrc = uimod.samplehgrcs[b'global'] |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
96 elif LEVEL_LOCAL: |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
97 samplehgrc = uimod.samplehgrcs[b'local'] |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
98 else: |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
99 samplehgrc = uimod.samplehgrcs[b'user'] |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
100 |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
101 f = paths[0] |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
102 util.writefile(f, util.tonativeeol(samplehgrc)) |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
103 |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
104 editor = ui.geteditor() |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
105 ui.system( |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
106 b"%s \"%s\"" % (editor, f), |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
107 onerr=error.InputError, |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
108 errprefix=_(b"edit failed"), |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
109 blockedtag=b'config_edit', |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
110 ) |
52418
e98cea8fc858
config: move "component display" in the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52417
diff
changeset
|
111 |
e98cea8fc858
config: move "component display" in the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52417
diff
changeset
|
112 |
e98cea8fc858
config: move "component display" in the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52417
diff
changeset
|
113 def show_component(ui: uimod.ui, repo) -> None: |
e98cea8fc858
config: move "component display" in the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52417
diff
changeset
|
114 """show the component used to build the config |
e98cea8fc858
config: move "component display" in the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52417
diff
changeset
|
115 |
e98cea8fc858
config: move "component display" in the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52417
diff
changeset
|
116 XXX this skip over various source and ignore the repository config, so it |
e98cea8fc858
config: move "component display" in the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52417
diff
changeset
|
117 XXX is probably useless old code. |
e98cea8fc858
config: move "component display" in the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52417
diff
changeset
|
118 """ |
e98cea8fc858
config: move "component display" in the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52417
diff
changeset
|
119 for t, f in rcutil.rccomponents(): |
e98cea8fc858
config: move "component display" in the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52417
diff
changeset
|
120 if t == b'path': |
e98cea8fc858
config: move "component display" in the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52417
diff
changeset
|
121 ui.debug(b'read config from: %s\n' % f) |
e98cea8fc858
config: move "component display" in the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52417
diff
changeset
|
122 elif t == b'resource': |
e98cea8fc858
config: move "component display" in the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52417
diff
changeset
|
123 ui.debug(b'read config from: resource:%s.%s\n' % (f[0], f[1])) |
e98cea8fc858
config: move "component display" in the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52417
diff
changeset
|
124 elif t == b'items': |
e98cea8fc858
config: move "component display" in the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52417
diff
changeset
|
125 # Don't print anything for 'items'. |
e98cea8fc858
config: move "component display" in the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52417
diff
changeset
|
126 pass |
e98cea8fc858
config: move "component display" in the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52417
diff
changeset
|
127 else: |
e98cea8fc858
config: move "component display" in the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52417
diff
changeset
|
128 raise error.ProgrammingError(b'unknown rctype: %s' % t) |
52419
04c3fb885fb6
config: extra the code showing config in its own module too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52418
diff
changeset
|
129 |
04c3fb885fb6
config: extra the code showing config in its own module too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52418
diff
changeset
|
130 |
04c3fb885fb6
config: extra the code showing config in its own module too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52418
diff
changeset
|
131 def show_config( |
04c3fb885fb6
config: extra the code showing config in its own module too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52418
diff
changeset
|
132 ui: uimod.ui, |
04c3fb885fb6
config: extra the code showing config in its own module too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52418
diff
changeset
|
133 repo, |
04c3fb885fb6
config: extra the code showing config in its own module too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52418
diff
changeset
|
134 value_filters: Collection[bytes], |
04c3fb885fb6
config: extra the code showing config in its own module too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52418
diff
changeset
|
135 formatter_options: dict, |
04c3fb885fb6
config: extra the code showing config in its own module too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52418
diff
changeset
|
136 untrusted: bool = False, |
04c3fb885fb6
config: extra the code showing config in its own module too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52418
diff
changeset
|
137 all_known: bool = False, |
04c3fb885fb6
config: extra the code showing config in its own module too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52418
diff
changeset
|
138 show_source: bool = False, |
04c3fb885fb6
config: extra the code showing config in its own module too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52418
diff
changeset
|
139 ) -> bool: |
04c3fb885fb6
config: extra the code showing config in its own module too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52418
diff
changeset
|
140 """Display config value to the user |
04c3fb885fb6
config: extra the code showing config in its own module too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52418
diff
changeset
|
141 |
04c3fb885fb6
config: extra the code showing config in its own module too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52418
diff
changeset
|
142 The display is done using a dedicated `formatter` object. |
04c3fb885fb6
config: extra the code showing config in its own module too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52418
diff
changeset
|
143 |
04c3fb885fb6
config: extra the code showing config in its own module too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52418
diff
changeset
|
144 |
04c3fb885fb6
config: extra the code showing config in its own module too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52418
diff
changeset
|
145 :value_filters: |
04c3fb885fb6
config: extra the code showing config in its own module too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52418
diff
changeset
|
146 if non-empty filter the display value according to these filters. If |
04c3fb885fb6
config: extra the code showing config in its own module too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52418
diff
changeset
|
147 the filter does not match any value, the function return False. True |
04c3fb885fb6
config: extra the code showing config in its own module too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52418
diff
changeset
|
148 otherwise. |
04c3fb885fb6
config: extra the code showing config in its own module too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52418
diff
changeset
|
149 |
04c3fb885fb6
config: extra the code showing config in its own module too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52418
diff
changeset
|
150 :formatter_option: |
04c3fb885fb6
config: extra the code showing config in its own module too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52418
diff
changeset
|
151 options passed to the formatter |
04c3fb885fb6
config: extra the code showing config in its own module too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52418
diff
changeset
|
152 |
04c3fb885fb6
config: extra the code showing config in its own module too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52418
diff
changeset
|
153 :untrusted: |
04c3fb885fb6
config: extra the code showing config in its own module too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52418
diff
changeset
|
154 When set, use untrusted value instead of ignoring them |
04c3fb885fb6
config: extra the code showing config in its own module too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52418
diff
changeset
|
155 |
04c3fb885fb6
config: extra the code showing config in its own module too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52418
diff
changeset
|
156 :all_known: |
04c3fb885fb6
config: extra the code showing config in its own module too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52418
diff
changeset
|
157 Display all known config item, not just the one with an explicit value. |
04c3fb885fb6
config: extra the code showing config in its own module too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52418
diff
changeset
|
158 |
04c3fb885fb6
config: extra the code showing config in its own module too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52418
diff
changeset
|
159 :show_source: |
04c3fb885fb6
config: extra the code showing config in its own module too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52418
diff
changeset
|
160 Show where each value has been defined. |
04c3fb885fb6
config: extra the code showing config in its own module too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52418
diff
changeset
|
161 """ |
04c3fb885fb6
config: extra the code showing config in its own module too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52418
diff
changeset
|
162 fm = ui.formatter(b'config', formatter_options) |
04c3fb885fb6
config: extra the code showing config in its own module too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52418
diff
changeset
|
163 selsections = selentries = [] |
04c3fb885fb6
config: extra the code showing config in its own module too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52418
diff
changeset
|
164 filtered = False |
04c3fb885fb6
config: extra the code showing config in its own module too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52418
diff
changeset
|
165 if value_filters: |
04c3fb885fb6
config: extra the code showing config in its own module too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52418
diff
changeset
|
166 selsections = [v for v in value_filters if b'.' not in v] |
04c3fb885fb6
config: extra the code showing config in its own module too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52418
diff
changeset
|
167 selentries = [v for v in value_filters if b'.' in v] |
04c3fb885fb6
config: extra the code showing config in its own module too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52418
diff
changeset
|
168 filtered = True |
04c3fb885fb6
config: extra the code showing config in its own module too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52418
diff
changeset
|
169 uniquesel = len(selentries) == 1 and not selsections |
04c3fb885fb6
config: extra the code showing config in its own module too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52418
diff
changeset
|
170 selsections = set(selsections) |
04c3fb885fb6
config: extra the code showing config in its own module too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52418
diff
changeset
|
171 selentries = set(selentries) |
04c3fb885fb6
config: extra the code showing config in its own module too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52418
diff
changeset
|
172 |
04c3fb885fb6
config: extra the code showing config in its own module too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52418
diff
changeset
|
173 matched = False |
04c3fb885fb6
config: extra the code showing config in its own module too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52418
diff
changeset
|
174 entries = ui.walkconfig(untrusted=untrusted, all_known=all_known) |
04c3fb885fb6
config: extra the code showing config in its own module too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52418
diff
changeset
|
175 for section, name, value in entries: |
04c3fb885fb6
config: extra the code showing config in its own module too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52418
diff
changeset
|
176 source = ui.configsource(section, name, untrusted) |
04c3fb885fb6
config: extra the code showing config in its own module too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52418
diff
changeset
|
177 value = pycompat.bytestr(value) |
04c3fb885fb6
config: extra the code showing config in its own module too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52418
diff
changeset
|
178 defaultvalue = ui.configdefault(section, name) |
04c3fb885fb6
config: extra the code showing config in its own module too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52418
diff
changeset
|
179 if fm.isplain(): |
04c3fb885fb6
config: extra the code showing config in its own module too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52418
diff
changeset
|
180 source = source or b'none' |
04c3fb885fb6
config: extra the code showing config in its own module too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52418
diff
changeset
|
181 value = value.replace(b'\n', b'\\n') |
04c3fb885fb6
config: extra the code showing config in its own module too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52418
diff
changeset
|
182 entryname = section + b'.' + name |
04c3fb885fb6
config: extra the code showing config in its own module too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52418
diff
changeset
|
183 if filtered and not (section in selsections or entryname in selentries): |
04c3fb885fb6
config: extra the code showing config in its own module too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52418
diff
changeset
|
184 continue |
04c3fb885fb6
config: extra the code showing config in its own module too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52418
diff
changeset
|
185 fm.startitem() |
04c3fb885fb6
config: extra the code showing config in its own module too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52418
diff
changeset
|
186 fm.condwrite(show_source, b'source', b'%s: ', source) |
04c3fb885fb6
config: extra the code showing config in its own module too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52418
diff
changeset
|
187 if uniquesel: |
04c3fb885fb6
config: extra the code showing config in its own module too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52418
diff
changeset
|
188 fm.data(name=entryname) |
04c3fb885fb6
config: extra the code showing config in its own module too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52418
diff
changeset
|
189 fm.write(b'value', b'%s\n', value) |
04c3fb885fb6
config: extra the code showing config in its own module too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52418
diff
changeset
|
190 else: |
04c3fb885fb6
config: extra the code showing config in its own module too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52418
diff
changeset
|
191 fm.write(b'name value', b'%s=%s\n', entryname, value) |
04c3fb885fb6
config: extra the code showing config in its own module too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52418
diff
changeset
|
192 if formatter.isprintable(defaultvalue): |
04c3fb885fb6
config: extra the code showing config in its own module too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52418
diff
changeset
|
193 fm.data(defaultvalue=defaultvalue) |
04c3fb885fb6
config: extra the code showing config in its own module too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52418
diff
changeset
|
194 elif isinstance(defaultvalue, list) and all( |
04c3fb885fb6
config: extra the code showing config in its own module too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52418
diff
changeset
|
195 formatter.isprintable(e) for e in defaultvalue |
04c3fb885fb6
config: extra the code showing config in its own module too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52418
diff
changeset
|
196 ): |
04c3fb885fb6
config: extra the code showing config in its own module too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52418
diff
changeset
|
197 fm.data(defaultvalue=fm.formatlist(defaultvalue, name=b'value')) |
04c3fb885fb6
config: extra the code showing config in its own module too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52418
diff
changeset
|
198 # TODO: no idea how to process unsupported defaultvalue types |
04c3fb885fb6
config: extra the code showing config in its own module too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52418
diff
changeset
|
199 matched = True |
04c3fb885fb6
config: extra the code showing config in its own module too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52418
diff
changeset
|
200 fm.end() |
04c3fb885fb6
config: extra the code showing config in its own module too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
52418
diff
changeset
|
201 return matched |