gitman 3.4b3__tar.gz → 3.4.1b2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. {gitman-3.4b3 → gitman-3.4.1b2}/PKG-INFO +3 -6
  2. {gitman-3.4b3 → gitman-3.4.1b2}/gitman/cli.py +17 -1
  3. {gitman-3.4b3 → gitman-3.4.1b2}/gitman/commands.py +9 -6
  4. {gitman-3.4b3 → gitman-3.4.1b2}/gitman/models/config.py +15 -12
  5. {gitman-3.4b3 → gitman-3.4.1b2}/gitman/plugin.py +7 -0
  6. {gitman-3.4b3 → gitman-3.4.1b2}/gitman/tests/test_cli.py +17 -2
  7. {gitman-3.4b3 → gitman-3.4.1b2}/gitman/tests/test_models_config.py +15 -1
  8. {gitman-3.4b3 → gitman-3.4.1b2}/gitman/tests/test_plugin.py +5 -1
  9. {gitman-3.4b3 → gitman-3.4.1b2}/pyproject.toml +9 -8
  10. gitman-3.4b3/setup.py +0 -39
  11. {gitman-3.4b3 → gitman-3.4.1b2}/LICENSE.md +0 -0
  12. {gitman-3.4b3 → gitman-3.4.1b2}/README.md +0 -0
  13. {gitman-3.4b3 → gitman-3.4.1b2}/gitman/__init__.py +0 -0
  14. {gitman-3.4b3 → gitman-3.4.1b2}/gitman/__main__.py +0 -0
  15. {gitman-3.4b3 → gitman-3.4.1b2}/gitman/common.py +0 -0
  16. {gitman-3.4b3 → gitman-3.4.1b2}/gitman/decorators.py +0 -0
  17. {gitman-3.4b3 → gitman-3.4.1b2}/gitman/exceptions.py +0 -0
  18. {gitman-3.4b3 → gitman-3.4.1b2}/gitman/git.py +0 -0
  19. {gitman-3.4b3 → gitman-3.4.1b2}/gitman/hook-gitman.py +0 -0
  20. {gitman-3.4b3 → gitman-3.4.1b2}/gitman/models/__init__.py +0 -0
  21. {gitman-3.4b3 → gitman-3.4.1b2}/gitman/models/group.py +0 -0
  22. {gitman-3.4b3 → gitman-3.4.1b2}/gitman/models/source.py +0 -0
  23. {gitman-3.4b3 → gitman-3.4.1b2}/gitman/settings.py +0 -0
  24. {gitman-3.4b3 → gitman-3.4.1b2}/gitman/shell.py +0 -0
  25. {gitman-3.4b3 → gitman-3.4.1b2}/gitman/tests/__init__.py +0 -0
  26. {gitman-3.4b3 → gitman-3.4.1b2}/gitman/tests/conftest.py +0 -0
  27. {gitman-3.4b3 → gitman-3.4.1b2}/gitman/tests/files/gdm-custom.yml +0 -0
  28. {gitman-3.4b3 → gitman-3.4.1b2}/gitman/tests/files/gdm-default.yml +0 -0
  29. {gitman-3.4b3 → gitman-3.4.1b2}/gitman/tests/files/gitman.yml +0 -0
  30. {gitman-3.4b3 → gitman-3.4.1b2}/gitman/tests/files/subdir/gitman.yml +0 -0
  31. {gitman-3.4b3 → gitman-3.4.1b2}/gitman/tests/files/subdir/subsubdir/gitman.yml +0 -0
  32. {gitman-3.4b3 → gitman-3.4.1b2}/gitman/tests/files/subdir/subsubdir/skip/subsubsubsubdir/gitman.yml +0 -0
  33. {gitman-3.4b3 → gitman-3.4.1b2}/gitman/tests/test_commands.py +0 -0
  34. {gitman-3.4b3 → gitman-3.4.1b2}/gitman/tests/test_common.py +0 -0
  35. {gitman-3.4b3 → gitman-3.4.1b2}/gitman/tests/test_git.py +0 -0
  36. {gitman-3.4b3 → gitman-3.4.1b2}/gitman/tests/test_models_group.py +0 -0
  37. {gitman-3.4b3 → gitman-3.4.1b2}/gitman/tests/test_models_source.py +0 -0
  38. {gitman-3.4b3 → gitman-3.4.1b2}/gitman/tests/test_shell.py +0 -0
  39. {gitman-3.4b3 → gitman-3.4.1b2}/gitman/tests/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: gitman
3
- Version: 3.4b3
3
+ Version: 3.4.1b2
4
4
  Summary: A language-agnostic dependency manager using Git.
5
5
  Home-page: https://pypi.org/project/gitman
6
6
  License: MIT
@@ -20,15 +20,12 @@ Classifier: Programming Language :: Python :: 3.8
20
20
  Classifier: Programming Language :: Python :: 3.9
21
21
  Classifier: Programming Language :: Python :: 3.10
22
22
  Classifier: Programming Language :: Python :: 3.11
23
- Classifier: Programming Language :: Python :: 3
24
- Classifier: Programming Language :: Python :: 3.10
25
- Classifier: Programming Language :: Python :: 3.8
26
- Classifier: Programming Language :: Python :: 3.9
23
+ Classifier: Programming Language :: Python :: 3.12
27
24
  Classifier: Topic :: Software Development
28
25
  Classifier: Topic :: Software Development :: Build Tools
29
26
  Classifier: Topic :: Software Development :: Version Control
30
27
  Classifier: Topic :: System :: Software Distribution
31
- Requires-Dist: datafiles (>=2.0,<3.0)
28
+ Requires-Dist: datafiles (>=2.1.2,<3.0.0)
32
29
  Requires-Dist: minilog (>=2.1,<3.0)
33
30
  Requires-Dist: universal-startfile (>=0.2,<0.3)
34
31
  Project-URL: Documentation, https://gitman.readthedocs.io
@@ -118,6 +118,13 @@ def main(args=None, function=None):
118
118
  action="store_true",
119
119
  dest="no_defaults",
120
120
  )
121
+ sub.add_argument(
122
+ "-S",
123
+ "--no-scripts",
124
+ help="skip running scripts after installation",
125
+ action="store_true",
126
+ dest="no_scripts",
127
+ )
121
128
 
122
129
  # Update parser
123
130
  info = "update dependencies to the latest versions"
@@ -144,6 +151,13 @@ def main(args=None, function=None):
144
151
  default=None,
145
152
  help="disable recording of updated versions",
146
153
  )
154
+ sub.add_argument(
155
+ "-S",
156
+ "--no-scripts",
157
+ help="skip running scripts after installation",
158
+ action="store_true",
159
+ dest="no_scripts",
160
+ )
147
161
 
148
162
  # List parser
149
163
  info = "display the current version of each dependency"
@@ -168,7 +182,7 @@ def main(args=None, function=None):
168
182
  "lock",
169
183
  description=info.capitalize() + ".",
170
184
  help=info,
171
- parents=[debug, project],
185
+ parents=[debug, project, depth],
172
186
  formatter_class=common.WideHelpFormatter,
173
187
  )
174
188
  sub.add_argument("name", nargs="*", help="list of dependency names to lock")
@@ -262,6 +276,7 @@ def _get_command(function, namespace):
262
276
  force_interactive=namespace.force_interactive,
263
277
  clean=namespace.clean,
264
278
  skip_changes=namespace.skip_changes,
279
+ skip_scripts=namespace.no_scripts,
265
280
  )
266
281
  if namespace.command == "install":
267
282
  kwargs.update(
@@ -287,6 +302,7 @@ def _get_command(function, namespace):
287
302
  args = namespace.name
288
303
  kwargs.update(
289
304
  root=namespace.root,
305
+ depth=namespace.depth,
290
306
  )
291
307
 
292
308
  elif namespace.command == "uninstall":
@@ -62,6 +62,7 @@ def install(
62
62
  clean=True,
63
63
  skip_changes=False,
64
64
  skip_default_group=False,
65
+ skip_scripts=False,
65
66
  ):
66
67
  """Install dependencies for a project.
67
68
 
@@ -80,6 +81,7 @@ def install(
80
81
  should be skipped
81
82
  - `skip_default_group`: indicates default_group should be skipped if
82
83
  `*names` is empty
84
+ - `skip_scripts`: indicates scripts should be skipped
83
85
  """
84
86
  log.info(
85
87
  "%sInstalling dependencies: %s",
@@ -90,10 +92,8 @@ def install(
90
92
 
91
93
  config = load_config(root)
92
94
  configs = [config] if config else []
93
- nested_configs = find_nested_configs(root, depth, [])
94
- if config is not None:
95
- nested_configs = filter_nested_configs(config, nested_configs)
96
- configs.extend(nested_configs)
95
+ configs.extend(find_nested_configs(root, depth, []))
96
+ configs = filter_nested_configs(configs)
97
97
 
98
98
  if configs:
99
99
  count = 0
@@ -117,7 +117,7 @@ def install(
117
117
  )
118
118
  count += _count # type: ignore
119
119
 
120
- if _count:
120
+ if _count and not skip_scripts:
121
121
  label = "nested scripts" if index else "scripts"
122
122
  common.show(f"Running {label}...", color="message", log=False)
123
123
  common.newline()
@@ -138,6 +138,7 @@ def update(
138
138
  lock=None, # pylint: disable=redefined-outer-name
139
139
  skip_changes=False,
140
140
  skip_default_group=False,
141
+ skip_scripts=False,
141
142
  ):
142
143
  """Update dependencies for a project.
143
144
 
@@ -157,6 +158,7 @@ def update(
157
158
  should be skipped
158
159
  - `skip_default_group`: indicates default_group should be skipped if
159
160
  `*names` is empty
161
+ - `skip_scripts`: indicates scripts should be skipped
160
162
  """
161
163
  log.info(
162
164
  "%s dependencies%s: %s",
@@ -200,7 +202,7 @@ def update(
200
202
  skip_changes=skip_changes or force_interactive,
201
203
  )
202
204
 
203
- if _count:
205
+ if _count and not skip_scripts:
204
206
  label = "nested scripts" if index else "scripts"
205
207
  common.show(f"Running {label}...", color="message", log=False)
206
208
  common.newline()
@@ -274,6 +276,7 @@ def lock(*names, depth=None, root=None):
274
276
  config = load_config(root)
275
277
  configs = [config] if config else []
276
278
  configs.extend(find_nested_configs(root, depth, []))
279
+ configs = filter_nested_configs(configs)
277
280
  if configs:
278
281
  count = 0
279
282
  common.newline()
@@ -6,7 +6,7 @@ from typing import Iterator, List, Optional
6
6
  import log
7
7
  from datafiles import datafile, field
8
8
 
9
- from .. import common, exceptions, settings, shell
9
+ from .. import common, exceptions, shell
10
10
  from ..decorators import preserve_cwd
11
11
  from .group import Group
12
12
  from .source import Identity, Source
@@ -426,7 +426,7 @@ def find_nested_configs(
426
426
  root = os.path.abspath(root) if root else _resolve_current_directory()
427
427
  configs: List[Config] = []
428
428
 
429
- if (depth is not None and depth <= 1) or settings.CI:
429
+ if depth is not None and depth <= 1:
430
430
  return configs
431
431
 
432
432
  log.debug(f"Searching for nested project in: {root}")
@@ -467,15 +467,18 @@ def _valid_filename(filename):
467
467
  return name in {"gitman", "gdm"} and ext in {".yml", ".yaml"}
468
468
 
469
469
 
470
- def filter_nested_configs(
471
- top_level_config: Config, nested_configs: List[Config]
472
- ) -> List[Config]:
470
+ def filter_nested_configs(configs: List[Config]) -> List[Config]:
473
471
  """Filter subdirectories inside of parent config."""
474
- configs = []
475
- config_location_path = Path(top_level_config.location_path)
476
- for nested_config in nested_configs:
477
- nested_config_root = Path(nested_config.location_path)
478
- if config_location_path in nested_config_root.parents:
479
- configs.append(nested_config)
472
+ filtered_configs = []
473
+ for config_a in configs:
474
+ is_nested = False
475
+ for config_b in configs:
476
+ if config_a == config_b:
477
+ continue
478
+ if Path(config_b.location_path) in Path(config_a.location_path).parents:
479
+ is_nested = True
480
+ break
481
+ if not is_nested:
482
+ filtered_configs.append(config_a)
480
483
 
481
- return configs
484
+ return filtered_configs
@@ -62,6 +62,13 @@ def main(args=None):
62
62
  action="store_true",
63
63
  dest="no_defaults",
64
64
  )
65
+ parser.add_argument(
66
+ "-S",
67
+ "--no-scripts",
68
+ help="skip running scripts after installation",
69
+ action="store_true",
70
+ dest="no_scripts",
71
+ )
65
72
 
66
73
  # Update option
67
74
  group.add_argument(
@@ -77,6 +77,7 @@ class TestInstall:
77
77
  fetch=False,
78
78
  clean=False,
79
79
  skip_changes=False,
80
+ skip_scripts=False,
80
81
  skip_default_group=False,
81
82
  )
82
83
 
@@ -93,6 +94,7 @@ class TestInstall:
93
94
  fetch=False,
94
95
  clean=False,
95
96
  skip_changes=False,
97
+ skip_scripts=False,
96
98
  skip_default_group=False,
97
99
  )
98
100
 
@@ -109,6 +111,7 @@ class TestInstall:
109
111
  fetch=False,
110
112
  clean=False,
111
113
  skip_changes=False,
114
+ skip_scripts=False,
112
115
  skip_default_group=False,
113
116
  )
114
117
 
@@ -125,6 +128,7 @@ class TestInstall:
125
128
  fetch=True,
126
129
  clean=False,
127
130
  skip_changes=False,
131
+ skip_scripts=False,
128
132
  skip_default_group=False,
129
133
  )
130
134
 
@@ -141,6 +145,7 @@ class TestInstall:
141
145
  fetch=False,
142
146
  clean=True,
143
147
  skip_changes=False,
148
+ skip_scripts=False,
144
149
  skip_default_group=False,
145
150
  )
146
151
 
@@ -159,6 +164,7 @@ class TestInstall:
159
164
  fetch=False,
160
165
  clean=False,
161
166
  skip_changes=False,
167
+ skip_scripts=False,
162
168
  skip_default_group=False,
163
169
  )
164
170
 
@@ -175,6 +181,7 @@ class TestInstall:
175
181
  fetch=False,
176
182
  clean=False,
177
183
  skip_changes=False,
184
+ skip_scripts=False,
178
185
  skip_default_group=False,
179
186
  )
180
187
 
@@ -204,6 +211,7 @@ class TestUpdate:
204
211
  recurse=False,
205
212
  lock=None,
206
213
  skip_changes=False,
214
+ skip_scripts=False,
207
215
  )
208
216
 
209
217
  @patch("gitman.commands.update")
@@ -220,6 +228,7 @@ class TestUpdate:
220
228
  recurse=True,
221
229
  lock=None,
222
230
  skip_changes=False,
231
+ skip_scripts=False,
223
232
  )
224
233
 
225
234
  @patch("gitman.commands.update")
@@ -236,6 +245,7 @@ class TestUpdate:
236
245
  recurse=False,
237
246
  lock=False,
238
247
  skip_changes=False,
248
+ skip_scripts=False,
239
249
  )
240
250
 
241
251
  @patch("gitman.commands.update")
@@ -252,6 +262,7 @@ class TestUpdate:
252
262
  recurse=False,
253
263
  lock=None,
254
264
  skip_changes=True,
265
+ skip_scripts=False,
255
266
  )
256
267
 
257
268
  @patch("gitman.commands.update")
@@ -268,6 +279,7 @@ class TestUpdate:
268
279
  recurse=False,
269
280
  lock=None,
270
281
  skip_changes=False,
282
+ skip_scripts=False,
271
283
  )
272
284
 
273
285
  @patch("gitman.commands.update")
@@ -284,6 +296,7 @@ class TestUpdate:
284
296
  recurse=False,
285
297
  lock=None,
286
298
  skip_changes=False,
299
+ skip_scripts=False,
287
300
  )
288
301
 
289
302
  @patch("gitman.commands.update")
@@ -302,6 +315,7 @@ class TestUpdate:
302
315
  recurse=False,
303
316
  lock=None,
304
317
  skip_changes=False,
318
+ skip_scripts=False,
305
319
  )
306
320
 
307
321
  @patch("gitman.commands.update")
@@ -318,6 +332,7 @@ class TestUpdate:
318
332
  recurse=False,
319
333
  lock=None,
320
334
  skip_changes=False,
335
+ skip_scripts=False,
321
336
  )
322
337
 
323
338
 
@@ -359,12 +374,12 @@ def describe_lock():
359
374
  @patch("gitman.commands.lock")
360
375
  def with_no_arguments(lock):
361
376
  cli.main(["lock"])
362
- lock.assert_called_once_with(root=None)
377
+ lock.assert_called_once_with(root=None, depth=5)
363
378
 
364
379
  @patch("gitman.commands.lock")
365
380
  def with_dependencies(lock):
366
381
  cli.main(["lock", "foo", "bar"])
367
- lock.assert_called_once_with("foo", "bar", root=None)
382
+ lock.assert_called_once_with("foo", "bar", root=None, depth=5)
368
383
 
369
384
 
370
385
  class TestUninstall:
@@ -5,7 +5,8 @@ import os
5
5
  import pytest
6
6
  from expecter import expect
7
7
 
8
- from gitman.models import Config, load_config
8
+ from gitman.models import Config, find_nested_configs, load_config
9
+ from gitman.models.config import filter_nested_configs
9
10
 
10
11
  from .conftest import FILES
11
12
 
@@ -148,3 +149,16 @@ class TestLoad:
148
149
  config = load_config()
149
150
 
150
151
  assert None is config
152
+
153
+ @pytest.mark.integration
154
+ def test_filter_nested_config(self):
155
+ """Verify that filter_nested_config removes nested configs"""
156
+ config = load_config(FILES)
157
+ assert None is not config
158
+ count = config.install_dependencies(depth=2)
159
+ assert 5 == count
160
+ configs = [config] if config else []
161
+ configs.extend(find_nested_configs(FILES, depth=2, skip_paths=[]))
162
+ assert 2 == len(configs)
163
+ configs = filter_nested_configs(configs)
164
+ assert 1 == len(configs)
@@ -6,7 +6,6 @@ from gitman import plugin
6
6
 
7
7
 
8
8
  class TestMain:
9
-
10
9
  """Unit tests for the top-level arguments."""
11
10
 
12
11
  @patch("gitman.cli.commands")
@@ -25,6 +24,7 @@ class TestMain:
25
24
  force=False,
26
25
  force_interactive=False,
27
26
  skip_changes=False,
27
+ skip_scripts=False,
28
28
  skip_default_group=False,
29
29
  ),
30
30
  call.install().__bool__(), # command status check
@@ -47,6 +47,7 @@ class TestMain:
47
47
  recurse=False,
48
48
  lock=True,
49
49
  skip_changes=False,
50
+ skip_scripts=False,
50
51
  ),
51
52
  call.update().__bool__(), # command status check
52
53
  ] == mock_commands.mock_calls
@@ -68,6 +69,7 @@ class TestMain:
68
69
  recurse=True,
69
70
  lock=True,
70
71
  skip_changes=False,
72
+ skip_scripts=False,
71
73
  ),
72
74
  call.update().__bool__(), # command status check
73
75
  ] == mock_commands.mock_calls
@@ -89,6 +91,7 @@ class TestMain:
89
91
  recurse=False,
90
92
  lock=False,
91
93
  skip_changes=False,
94
+ skip_scripts=False,
92
95
  ),
93
96
  call.update().__bool__(), # command status check
94
97
  ] == mock_commands.mock_calls
@@ -110,6 +113,7 @@ class TestMain:
110
113
  recurse=False,
111
114
  lock=True,
112
115
  skip_changes=True,
116
+ skip_scripts=False,
113
117
  ),
114
118
  call.update().__bool__(), # command status check
115
119
  ] == mock_commands.mock_calls
@@ -1,7 +1,7 @@
1
1
  [tool.poetry]
2
2
 
3
3
  name = "gitman"
4
- version = "3.4b3"
4
+ version = "3.4.1b2"
5
5
  description = "A language-agnostic dependency manager using Git."
6
6
 
7
7
  license = "MIT"
@@ -33,6 +33,7 @@ classifiers = [
33
33
  "Programming Language :: Python :: 3.8",
34
34
  "Programming Language :: Python :: 3.9",
35
35
  "Programming Language :: Python :: 3.10",
36
+ "Programming Language :: Python :: 3.11",
36
37
  "Topic :: Software Development",
37
38
  "Topic :: Software Development :: Build Tools",
38
39
  "Topic :: Software Development :: Version Control",
@@ -43,7 +44,7 @@ classifiers = [
43
44
 
44
45
  python = "^3.8"
45
46
 
46
- datafiles = "^2.0"
47
+ datafiles = "^2.1.2"
47
48
  minilog = "^2.1"
48
49
  universal-startfile = "~0.2"
49
50
 
@@ -54,15 +55,15 @@ black = "^22.1"
54
55
  isort = "^5.10"
55
56
 
56
57
  # Linters
57
- mypy = "~0.940"
58
+ mypy = "^1.3"
58
59
  pydocstyle = "*"
59
60
  pylint = "~2.6"
60
61
  types-freezegun = "*"
61
62
  types-setuptools = "*"
62
63
 
63
64
  # Testing
64
- pytest = "^6"
65
- pytest-cov = "*"
65
+ pytest = "^7.3"
66
+ pytest-cov = "^4.1"
66
67
  pytest-describe = "^2.0"
67
68
  pytest-expecter = "^3.0"
68
69
  pytest-random = "*"
@@ -74,15 +75,15 @@ coveragespace = "^6.0"
74
75
  # Documentation
75
76
  mkdocs = "^1.2.3"
76
77
  mkdocstrings = "^0.18.1"
77
- pygments = "^2.7.4"
78
- jinja2 = "~3.0.3"
78
+ pygments = "^2.15.0"
79
+ jinja2 = "~3.1.3"
79
80
 
80
81
  # Tooling
81
82
  pyinstaller = "^4.0"
82
83
  sniffer = "*"
83
84
  macfsevents = { version = "*", platform = "darwin" }
84
85
  pync = { version = "*", platform = "darwin" }
85
- rope = "^0.14.0"
86
+ rope = "^0.14"
86
87
 
87
88
  [tool.poetry.scripts]
88
89
 
gitman-3.4b3/setup.py DELETED
@@ -1,39 +0,0 @@
1
- # -*- coding: utf-8 -*-
2
- from setuptools import setup
3
-
4
- packages = \
5
- ['gitman', 'gitman.models', 'gitman.tests']
6
-
7
- package_data = \
8
- {'': ['*'],
9
- 'gitman.tests': ['files/*',
10
- 'files/subdir/*',
11
- 'files/subdir/subsubdir/*',
12
- 'files/subdir/subsubdir/skip/subsubsubsubdir/*']}
13
-
14
- install_requires = \
15
- ['datafiles>=2.0,<3.0', 'minilog>=2.1,<3.0', 'universal-startfile>=0.2,<0.3']
16
-
17
- entry_points = \
18
- {'console_scripts': ['git-deps = gitman.plugin:main',
19
- 'gitman = gitman.cli:main']}
20
-
21
- setup_kwargs = {
22
- 'name': 'gitman',
23
- 'version': '3.4b3',
24
- 'description': 'A language-agnostic dependency manager using Git.',
25
- 'long_description': '## Overview\n\nGitman is a language-agnostic dependency manager using Git. It aims to serve as a submodules replacement and provides advanced options for managing versions of nested Git repositories.\n\n[![Demo](https://raw.githubusercontent.com/jacebrowning/gitman/main/docs/demo.gif)](https://asciinema.org/a/3DLos4HIU84P0AfFlZMYcgPus)\n\n[![Unix Build Status](https://img.shields.io/travis/com/jacebrowning/gitman/main.svg?label=unix)](https://travis-ci.com/jacebrowning/gitman)\n[![Windows Build Status](https://img.shields.io/appveyor/ci/jacebrowning/gitman/main.svg?label=window)](https://ci.appveyor.com/project/jacebrowning/gitman)\n[![Coverage Status](https://img.shields.io/coveralls/jacebrowning/gitman/main.svg)](https://coveralls.io/r/jacebrowning/gitman)\n[![Scrutinizer Code Quality](https://img.shields.io/scrutinizer/g/jacebrowning/gitman.svg)](https://scrutinizer-ci.com/g/jacebrowning/gitman/?branch=main)\n[![PyPI License](https://img.shields.io/pypi/l/gitman.svg)](https://pypi.org/project/gitman)\n[![PyPI Version](https://img.shields.io/pypi/v/gitman.svg)](https://pypi.org/project/gitman)\n[![PyPI Downloads](https://img.shields.io/pypi/dm/gitman.svg?color=orange)](https://pypistats.org/packages/gitman)\n\n## Setup\n\n### Requirements\n\n- Python 3.8+\n- Git 2.8+ (with [stored credentials](http://gitman.readthedocs.io/en/latest/setup/git/))\n\n### Installation\n\nInstall this tool globally with [pipx](https://pipxproject.github.io/pipx/) (or pip):\n\n```sh\n$ pipx install gitman\n```\nor add it to your [Poetry](https://python-poetry.org/docs/) project:\n\n```sh\n$ poetry add gitman\n```\n\n### Configuration\n\nGenerate a sample config file:\n\n```sh\n$ gitman init\n```\n\nor manually create one (`gitman.yml` or `.gitman.yml`) in the root of your working tree:\n\n```yaml\nlocation: vendor/gitman\n\nsources:\n - repo: "https://github.com/kstenerud/iOS-Universal-Framework"\n name: framework\n rev: Mk5-end-of-life\n - repo: "https://github.com/jonreid/XcodeCoverage"\n name: coverage\n links:\n - target: Tools/XcodeCoverage\n - repo: "https://github.com/dxa4481/truffleHog"\n name: trufflehog\n rev: master\n scripts:\n - chmod a+x truffleHog/truffleHog.py\n - repo: "https://github.com/FortAwesome/Font-Awesome"\n name: fontawesome\n rev: master\n sparse_paths:\n - "webfonts/*"\n - repo: "https://github.com/google/material-design-icons"\n name: material-design-icons\n rev: master\n\ngroups:\n - name: code\n members:\n - framework\n - trufflehog\n - name: resources\n members:\n - fontawesome\n - material-design-icons\n\ndefault_group: code\n```\n\nIgnore the dependency storage location:\n\n```sh\n$ echo vendor/gitman >> .gitignore\n```\n\n## Usage\n\nSee the available commands:\n\n```sh\n$ gitman --help\n```\n\n### Updating Dependencies\n\nGet the latest versions of all dependencies:\n\n```sh\n$ gitman update\n```\n\nwhich will essentially:\n\n1. Create a working tree at `<root>`/`<location>`/`<name>`\n2. Fetch from `repo` and checkout the specified `rev`\n3. Symbolically link each `<location>`/`<name>` from `<root>`/`<link>` (if specified)\n4. Repeat for all nested working trees containing a config file\n5. Record the actual commit SHAs that were checked out (with `--lock` option)\n6. Run optional post-install scripts for each dependency\n\nwhere `rev` can be:\n\n- all or part of a commit SHA: `123def`\n- a tag: `v1.0`\n- a branch: `main`\n- a `rev-parse` date: `\'main@{2015-06-18 10:30:59}\'`\n\nAlternatively, get the latest versions of specific dependencies:\n\n```sh\n$ gitman update framework\n```\n\nor named groups:\n\n```sh\n$ gitman update resources\n```\n\n### Restoring Previous Versions\n\nDisplay the versions that are currently installed:\n\n```sh\n$ gitman list\n```\n\nReinstall these specific versions at a later time:\n\n```sh\n$ gitman install\n```\n\n### Deleting Dependencies\n\nRemove all installed dependencies:\n\n```sh\n$ gitman uninstall\n```\n\n## Resources\n\n- [Source code](https://github.com/jacebrowning/gitman)\n- [Issue tracker](https://github.com/jacebrowning/gitman/issues)\n- [Release history](https://github.com/jacebrowning/gitman/blob/main/CHANGELOG.md)\n',
26
- 'author': 'Jace Browning',
27
- 'author_email': 'jacebrowning@gmail.com',
28
- 'maintainer': 'None',
29
- 'maintainer_email': 'None',
30
- 'url': 'https://pypi.org/project/gitman',
31
- 'packages': packages,
32
- 'package_data': package_data,
33
- 'install_requires': install_requires,
34
- 'entry_points': entry_points,
35
- 'python_requires': '>=3.8,<4.0',
36
- }
37
-
38
-
39
- setup(**setup_kwargs)
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes