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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 )