1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
|
From 4612dfa7a36c9f5520b427557dc0150bbe3af887 Mon Sep 17 00:00:00 2001
From: Roman Bogorodskiy <bogorodskiy@gmail.com>
Date: Sun, 18 May 2025 07:11:18 +0200
Subject: [PATCH] Allow to override /etc dir location
Some systems, e.g. FreeBSD, place third-part software configuration
files in /usr/local/etc instead of /etc.
Extend the install command to accept "etcprefix" option used for global
configuration paths. By default it's "/", so it keeps the current
behaviour unchanged.
Signed-off-by: Roman Bogorodskiy <bogorodskiy@gmail.com>
---
avocado/core/settings.py | 3 ++-
avocado/core/utils/path.py | 4 +++-
avocado/paths.py | 2 ++
setup.py | 23 +++++++++++++++++++++++
4 files changed, 30 insertions(+), 2 deletions(-)
create mode 100644 avocado/paths.py
diff --git avocado/core/settings.py avocado/core/settings.py
index b497bf0f..b76d0d0d 100644
--- avocado/core/settings.py
+++ avocado/core/settings.py
@@ -46,6 +46,7 @@ import re
from pkg_resources import resource_exists, resource_filename
from avocado.core.settings_dispatcher import SettingsDispatcher
+from avocado import paths
def sorted_dict(dict_object):
@@ -407,7 +408,7 @@ class Settings:
self.all_config_paths.append(self._config_path_local)
def _prepare_base_dirs(self):
- cfg_dir = "/etc"
+ cfg_dir = os.path.join(paths.ETCPREFIX, "/etc")
user_dir = os.path.expanduser("~")
if "VIRTUAL_ENV" in os.environ:
diff --git avocado/core/utils/path.py avocado/core/utils/path.py
index 8037bdd5..5f1f9ce5 100644
--- avocado/core/utils/path.py
+++ avocado/core/utils/path.py
@@ -1,5 +1,7 @@
import os
+from avocado import paths
+
from pkg_resources import get_distribution
@@ -32,7 +34,7 @@ def system_wide_or_base_path(file_path):
if os.path.isabs(file_path):
abs_path = file_path
else:
- abs_path = os.path.join(os.path.sep, file_path)
+ abs_path = os.path.join(paths.ETCPREFIX, file_path)
if os.path.exists(abs_path):
return abs_path
return prepend_base_path(file_path)
diff --git avocado/paths.py avocado/paths.py
new file mode 100644
index 00000000..4d2b2f88
--- /dev/null
+++ avocado/paths.py
@@ -0,0 +1,2 @@
+# To be overriden by setup.py
+ETCPREFIX = "/"
diff --git setup.py setup.py
index d9e1d795..58671d03 100755
--- setup.py
+++ setup.py
@@ -23,6 +23,7 @@ from pathlib import Path
from subprocess import CalledProcessError, run
import setuptools.command.develop
+import setuptools.command.install
from setuptools import Command, find_packages, setup
# pylint: disable=E0611
@@ -203,6 +204,27 @@ class Develop(setuptools.command.develop.develop):
self.handle_uninstall()
+class Install(setuptools.command.install.install):
+ """Custom install command."""
+
+ user_options = setuptools.command.install.install.user_options + [
+ ("etcprefix=", None, "The etc directory prefix [default: /]"),
+ ]
+
+ def initialize_options(self):
+ super().initialize_options()
+ self.etcprefix = "/usr/local" # pylint: disable=W0201
+
+ def run(self):
+ pkg_dir = os.path.join(self.build_lib, 'avocado')
+ os.makedirs(pkg_dir, exist_ok=True)
+
+ with open(os.path.join(pkg_dir, 'paths.py'), 'w') as f:
+ f.write(f'ETCPREFIX = "{self.etcprefix}"')
+
+ super().run()
+
+
class SimpleCommand(Command):
"""Make Command implementation simpler."""
@@ -504,6 +526,7 @@ if __name__ == "__main__":
cmdclass={
"clean": Clean,
"develop": Develop,
+ "install": Install,
"lint": Linter,
"man": Man,
"plugin": Plugin,
--
2.49.0
|