Mercurial > public > mercurial-scm > hg
annotate mercurial/configuration/command.py @ 52417:c97e0fd26225
config: move edition code in its own module
We start to move code related to the command outside of the main commands
modules for clarity. This also highlight some flaw in this code and the new flag
are missing some error handling. However we will deal with them later.
This move removes the needs for a few module import in the `commands.py` which I
see as a good sign.
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Mon, 21 Oct 2024 14:05:14 +0200 |
parents | |
children | e98cea8fc858 |
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 |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
7 from typing import Any, Dict, Optional |
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, |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
14 requirements, |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
15 ui as uimod, |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
16 util, |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
17 vfs as vfsmod, |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
18 ) |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
19 |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
20 from . import rcutil |
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 EDIT_FLAG = 'edit' |
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 |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
25 # 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
|
26 ConfigLevelT = str |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
27 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
|
28 LEVEL_LOCAL = 'local' |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
29 LEVEL_GLOBAL = 'global' |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
30 LEVEL_SHARED = 'shared' |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
31 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
|
32 EDIT_LEVELS = ( |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
33 LEVEL_USER, |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
34 LEVEL_LOCAL, |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
35 LEVEL_GLOBAL, |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
36 LEVEL_SHARED, |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
37 LEVEL_NON_SHARED, |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
38 ) |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
39 |
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 def find_edit_level( |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
42 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
|
43 ) -> Optional[ConfigLevelT]: |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
44 """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
|
45 |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
46 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
|
47 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
|
48 """ |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
49 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
|
50 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
|
51 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
|
52 if opts.get(level): |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
53 return level |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
54 return EDIT_LEVELS[0] |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
55 return None |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
56 |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
57 |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
58 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
|
59 """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
|
60 |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
61 if level == LEVEL_USER: |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
62 paths = rcutil.userrcpath() |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
63 elif level == LEVEL_GLOBAL: |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
64 paths = rcutil.systemrcpath() |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
65 elif level == LEVEL_LOCAL: |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
66 if not repo: |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
67 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
|
68 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
|
69 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
|
70 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
|
71 elif level == LEVEL_SHARED: |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
72 if not repo.shared(): |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
73 raise error.InputError( |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
74 _(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
|
75 ) |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
76 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
|
77 raise error.InputError( |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
78 _( |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
79 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
|
80 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
|
81 ) |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
82 ) |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
83 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
|
84 else: |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
85 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
|
86 raise error.ProgrammingError(msg) |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
87 |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
88 for f in paths: |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
89 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
|
90 break |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
91 else: |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
92 if LEVEL_GLOBAL: |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
93 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
|
94 elif LEVEL_LOCAL: |
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'local'] |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
96 else: |
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'user'] |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
98 |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
99 f = paths[0] |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
100 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
|
101 |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
102 editor = ui.geteditor() |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
103 ui.system( |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
104 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
|
105 onerr=error.InputError, |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
106 errprefix=_(b"edit failed"), |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
107 blockedtag=b'config_edit', |
c97e0fd26225
config: move edition code in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
108 ) |