batchfetch 1.1.9__tar.gz → 1.2.1__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.
@@ -0,0 +1,138 @@
1
+ # Byte-compiled / optimized / DLL files
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+
6
+ # C extensions
7
+ *.so
8
+
9
+ # Distribution / packaging
10
+ .Python
11
+ build/
12
+ develop-eggs/
13
+ dist/
14
+ downloads/
15
+ eggs/
16
+ .eggs/
17
+ lib/
18
+ lib64/
19
+ parts/
20
+ sdist/
21
+ var/
22
+ wheels/
23
+ share/python-wheels/
24
+ *.egg-info/
25
+ .installed.cfg
26
+ *.egg
27
+ MANIFEST
28
+
29
+ # PyInstaller
30
+ # Usually these files are written by a python script from a template
31
+ # before PyInstaller builds the exe, so as to inject date/other infos into it.
32
+ *.manifest
33
+ *.spec
34
+
35
+ # Installer logs
36
+ pip-log.txt
37
+ pip-delete-this-directory.txt
38
+
39
+ # Unit test / coverage reports
40
+ htmlcov/
41
+ .tox/
42
+ .nox/
43
+ .coverage
44
+ .coverage.*
45
+ .cache
46
+ nosetests.xml
47
+ coverage.xml
48
+ *.cover
49
+ *.py,cover
50
+ .hypothesis/
51
+ .pytest_cache/
52
+ cover/
53
+
54
+ # Translations
55
+ *.mo
56
+ *.pot
57
+
58
+ # Django stuff:
59
+ *.log
60
+ local_settings.py
61
+ db.sqlite3
62
+ db.sqlite3-journal
63
+
64
+ # Flask stuff:
65
+ instance/
66
+ .webassets-cache
67
+
68
+ # Scrapy stuff:
69
+ .scrapy
70
+
71
+ # Sphinx documentation
72
+ docs/_build/
73
+
74
+ # PyBuilder
75
+ .pybuilder/
76
+ target/
77
+
78
+ # Jupyter Notebook
79
+ .ipynb_checkpoints
80
+
81
+ # IPython
82
+ profile_default/
83
+ ipython_config.py
84
+
85
+ # pyenv
86
+ # For a library or package, you might want to ignore these files since the code is
87
+ # intended to run in multiple environments; otherwise, check them in:
88
+ # .python-version
89
+
90
+ # pipenv
91
+ # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
92
+ # However, in case of collaboration, if having platform-specific dependencies or dependencies
93
+ # having no cross-platform support, pipenv may install dependencies that don't work, or not
94
+ # install all needed dependencies.
95
+ #Pipfile.lock
96
+
97
+ # PEP 582; used by e.g. github.com/David-OConnor/pyflow
98
+ __pypackages__/
99
+
100
+ # Celery stuff
101
+ celerybeat-schedule
102
+ celerybeat.pid
103
+
104
+ # SageMath parsed files
105
+ *.sage.py
106
+
107
+ # Environments
108
+ .env
109
+ .venv
110
+ env/
111
+ venv/
112
+ ENV/
113
+ env.bak/
114
+ venv.bak/
115
+
116
+ # Spyder project settings
117
+ .spyderproject
118
+ .spyproject
119
+
120
+ # Rope project settings
121
+ .ropeproject
122
+
123
+ # mkdocs documentation
124
+ /site
125
+
126
+ # mypy
127
+ .mypy_cache/
128
+ .dmypy.json
129
+ dmypy.json
130
+
131
+ # Pyre type checker
132
+ .pyre/
133
+
134
+ # pytype static type analyzer
135
+ .pytype/
136
+
137
+ # Cython debug symbols
138
+ cython_debug/
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: batchfetch
3
- Version: 1.1.9
3
+ Version: 1.2.1
4
4
  Summary: Efficiently clone and pull multiple Git repositories.
5
5
  Home-page: https://github.com/jamescherti/batchfetch
6
6
  Author: James Cherti
@@ -57,12 +57,12 @@ tasks:
57
57
  # Clone the tag 1.5 of the consult repository to the './consult'
58
58
  # directory
59
59
  - git: https://github.com/minad/consult
60
- reference: "1.5"
60
+ revision: "1.5"
61
61
 
62
62
  # Clone the s.el repository to the './another-name.el' directory
63
63
  - git: https://github.com/magnars/s.el
64
64
  path: another-name.el
65
- reference: dda84d38fffdaf0c9b12837b504b402af910d01d
65
+ revision: dda84d38fffdaf0c9b12837b504b402af910d01d
66
66
 
67
67
  # Delete './impatient-mode'
68
68
  - git: https://github.com/skeeto/impatient-mode
@@ -37,12 +37,12 @@ tasks:
37
37
  # Clone the tag 1.5 of the consult repository to the './consult'
38
38
  # directory
39
39
  - git: https://github.com/minad/consult
40
- reference: "1.5"
40
+ revision: "1.5"
41
41
 
42
42
  # Clone the s.el repository to the './another-name.el' directory
43
43
  - git: https://github.com/magnars/s.el
44
44
  path: another-name.el
45
- reference: dda84d38fffdaf0c9b12837b504b402af910d01d
45
+ revision: dda84d38fffdaf0c9b12837b504b402af910d01d
46
46
 
47
47
  # Delete './impatient-mode'
48
48
  - git: https://github.com/skeeto/impatient-mode
@@ -32,8 +32,8 @@ from .batchfetch_base import BatchFetchError, TaskBatchFetch
32
32
  from .helpers import run_simple
33
33
 
34
34
 
35
- class GitReferenceDoesNotExist(Exception):
36
- """The Git reference does not exist."""
35
+ class GitRevisionDoesNotExist(Exception):
36
+ """The Git revision does not exist."""
37
37
 
38
38
 
39
39
  class GitRemoteError(Exception):
@@ -58,6 +58,7 @@ class BatchFetchGit(TaskBatchFetch):
58
58
  self.task_schema.update({
59
59
  # Local options
60
60
  self.main_key: str,
61
+ Optional("revision"): str,
61
62
  Optional("reference"): str,
62
63
 
63
64
  # Same as global options
@@ -77,7 +78,7 @@ class BatchFetchGit(TaskBatchFetch):
77
78
 
78
79
  self.task_default_values.update({
79
80
  self.main_key: "",
80
- "reference": "",
81
+ "revision": "",
81
82
  "delete": False,
82
83
  })
83
84
 
@@ -100,6 +101,11 @@ class BatchFetchGit(TaskBatchFetch):
100
101
  """Clone or update a Git repository."""
101
102
  super().update()
102
103
 
104
+ # Backward compatibility
105
+ if "reference" in self._item_values \
106
+ and "revision" not in self._item_values:
107
+ self._item_values["revision"] = "reference"
108
+
103
109
  is_clone = False
104
110
  if not self.git_local_dir.exists():
105
111
  is_clone = True
@@ -113,8 +119,8 @@ class BatchFetchGit(TaskBatchFetch):
113
119
  update_type = "UPDATE"
114
120
 
115
121
  self.add_output(f"[GIT {update_type}] {self[self.main_key]}" +
116
- (f" (Ref: {self['reference']})"
117
- if self["reference"] else "") + "\n")
122
+ (f" (Ref: {self['revision']})"
123
+ if self["revision"] else "") + "\n")
118
124
 
119
125
  try:
120
126
  # Delete
@@ -160,7 +166,7 @@ class BatchFetchGit(TaskBatchFetch):
160
166
  return self.values
161
167
 
162
168
  def _git_ref(self, cwd: Union[None, Path] = None) -> str:
163
- """Get the commit reference of HEAD.
169
+ """Get the commit revision of HEAD.
164
170
 
165
171
  The command will fail if the branch is detached.
166
172
  """
@@ -191,11 +197,11 @@ class BatchFetchGit(TaskBatchFetch):
191
197
  # If the tag is annotated, it points to a tag object, not
192
198
  # directly to a commit. You need to resolve it to the
193
199
  # commit it points to. Using `git rev-parse
194
- # <tagname>^{commit}` allows getting the right reference.
195
- commit_ref = self._git_tags(self["reference"] +
200
+ # <tagname>^{commit}` allows getting the right revision.
201
+ commit_ref = self._git_tags(self["revision"] +
196
202
  "^{commit}")[0]
197
203
  self.branch_commit_ref = commit_ref.strip()
198
- except GitReferenceDoesNotExist:
204
+ except GitRevisionDoesNotExist:
199
205
  pass
200
206
 
201
207
  def _repo_delete(self):
@@ -235,21 +241,21 @@ class BatchFetchGit(TaskBatchFetch):
235
241
  do_git_pull = self["git_pull"]
236
242
  if self.is_branch:
237
243
  do_git_pull = True
238
- elif not self["reference"]:
244
+ elif not self["revision"]:
239
245
  do_git_pull = True
240
246
  self.add_output(self.indent_spaces +
241
247
  "[INFO] Git fetch origin reason: " +
242
- "No 'reference:' specified\n")
248
+ "No 'revision:' specified\n")
243
249
  else:
244
250
  do_git_pull = False
245
251
  commit_ref = None
246
252
 
247
253
  try:
248
- # Check if the reference such as
254
+ # Check if the revision such as
249
255
  # 0560fe21d1173b2221fd8c600fab818f7eecbad4 exist
250
- commit_ref = self._git_tags(self["reference"])[0]
256
+ commit_ref = self._git_tags(self["revision"])[0]
251
257
  commit_ref = commit_ref.strip()
252
- except GitReferenceDoesNotExist:
258
+ except GitRevisionDoesNotExist:
253
259
  pass
254
260
 
255
261
  if not commit_ref and not self.is_branch:
@@ -257,19 +263,19 @@ class BatchFetchGit(TaskBatchFetch):
257
263
  self.add_output(
258
264
  self.indent_spaces +
259
265
  "[INFO] Git fetch origin reason: " +
260
- f"The reference does not exist: {self['reference']}" +
266
+ f"The revision does not exist: {self['revision']}" +
261
267
  "\n")
262
268
 
263
269
  if not do_git_pull:
264
270
  try:
265
271
  # Check if the branch is a tag or a branch
266
272
  cmd = ["git", "show-ref", "--verify", "--quiet",
267
- f"refs/heads/{self['reference']}"]
273
+ f"refs/heads/{self['revision']}"]
268
274
  run_simple(cmd, env=self.env, cwd=self.git_local_dir)
269
275
  self.add_output(
270
276
  self.indent_spaces +
271
277
  "[INFO] Git fetch origin reason:" +
272
- f"{self['reference']} is a branch, not a tag" +
278
+ f"{self['revision']} is a branch, not a tag" +
273
279
  "\n")
274
280
  do_git_pull = True
275
281
  except subprocess.CalledProcessError:
@@ -282,14 +288,14 @@ class BatchFetchGit(TaskBatchFetch):
282
288
  # not directly to a commit. You need to resolve it to
283
289
  # the commit it points to. Using `git rev-parse
284
290
  # <tagname>^{commit}` allows getting the right
285
- # reference.
291
+ # revision.
286
292
  commit_ref_head = self._git_tags("HEAD^{commit}")[0]
287
293
  commit_ref_head = commit_ref_head.strip()
288
- except GitReferenceDoesNotExist:
294
+ except GitRevisionDoesNotExist:
289
295
  # HEAD is detached
290
296
  commit_ref_head = None
291
297
 
292
- # The wanted commit reference does not exist
298
+ # The wanted commit revision does not exist
293
299
  # Or the commit ref of HEAD hasn't changed
294
300
  if not commit_ref_head or commit_ref_head != commit_ref:
295
301
  self.add_output(
@@ -395,46 +401,46 @@ class BatchFetchGit(TaskBatchFetch):
395
401
  error = True
396
402
 
397
403
  if error:
398
- raise GitReferenceDoesNotExist(
399
- f"The reference '{branch}' does not exist.")
404
+ raise GitRevisionDoesNotExist(
405
+ f"The revision '{branch}' does not exist.")
400
406
 
401
407
  return stdout
402
408
 
403
409
  def _repo_fix_branch(self) -> bool:
404
410
  git_ref_after_merge = self._git_ref(cwd=self.git_local_dir)
405
411
  branch_changed = False
406
- if self["reference"]:
412
+ if self["revision"]:
407
413
  # We also need tags because sometimes, a branch
408
- # returns a different commit reference
414
+ # returns a different commit revision
409
415
  git_tags, _ = run_simple(
410
416
  ["git", "tag", "--points-at", "HEAD"],
411
417
  env=self.env,
412
418
  cwd=self.git_local_dir,
413
419
  )
414
420
 
415
- # Also check the commit reference in case
416
- # branch is a commit reference instead of a tag
421
+ # Also check the commit revision in case
422
+ # branch is a commit revision instead of a tag
417
423
  try:
418
424
  # Check if the branch exists
419
425
  git_ref_branch = self._git_tags("origin/" +
420
- self["reference"] +
426
+ self["revision"] +
421
427
  "^{commit}")[0]
422
- except GitReferenceDoesNotExist as err:
428
+ except GitRevisionDoesNotExist:
423
429
  # Check if the commit ref exists
424
430
  try:
425
- git_ref_branch = self._git_tags(self["reference"])[0]
426
- except GitReferenceDoesNotExist as err:
427
- raise BatchFetchError(f"The branch '{self['reference']}' "
431
+ git_ref_branch = self._git_tags(self["revision"])[0]
432
+ except GitRevisionDoesNotExist as err:
433
+ raise BatchFetchError(f"The branch '{self['revision']}' "
428
434
  "does not exist.") from err
429
435
 
430
436
  if git_ref_after_merge != git_ref_branch and \
431
- self["reference"] not in git_tags:
437
+ self["revision"] not in git_tags:
432
438
  # Update the branch
433
- self._run(["git", "checkout"] + [self["reference"]],
439
+ self._run(["git", "checkout"] + [self["revision"]],
434
440
  cwd=str(self.git_local_dir), env=self.env)
435
441
  self.add_output(self.indent_spaces +
436
442
  "[INFO] Branch changed to " +
437
- self["reference"] + "\n")
443
+ self["revision"] + "\n")
438
444
  self.set_changed(True)
439
445
  branch_changed = True
440
446
 
@@ -460,7 +466,7 @@ class BatchFetchGit(TaskBatchFetch):
460
466
  # 3. It does not directly consult the upstream repositories
461
467
  # of the submodules.
462
468
  # 4. Submodules are updated to reflect the exact commits
463
- # referenced in the parent repository's configuration,
469
+ # revision in the parent repository's configuration,
464
470
  # potentially lagging behind the latest changes made in the
465
471
  # upstream repositories.
466
472
  if self.git_local_dir.joinpath(".gitmodules").is_file():
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: batchfetch
3
- Version: 1.1.9
3
+ Version: 1.2.1
4
4
  Summary: Efficiently clone and pull multiple Git repositories.
5
5
  Home-page: https://github.com/jamescherti/batchfetch
6
6
  Author: James Cherti
@@ -57,12 +57,12 @@ tasks:
57
57
  # Clone the tag 1.5 of the consult repository to the './consult'
58
58
  # directory
59
59
  - git: https://github.com/minad/consult
60
- reference: "1.5"
60
+ revision: "1.5"
61
61
 
62
62
  # Clone the s.el repository to the './another-name.el' directory
63
63
  - git: https://github.com/magnars/s.el
64
64
  path: another-name.el
65
- reference: dda84d38fffdaf0c9b12837b504b402af910d01d
65
+ revision: dda84d38fffdaf0c9b12837b504b402af910d01d
66
66
 
67
67
  # Delete './impatient-mode'
68
68
  - git: https://github.com/skeeto/impatient-mode
@@ -1,5 +1,7 @@
1
+ .gitignore
1
2
  LICENSE
2
3
  README.md
4
+ run_tests.sh
3
5
  setup.py
4
6
  batchfetch/__init__.py
5
7
  batchfetch/batchfetch_base.py
@@ -11,4 +13,7 @@ batchfetch.egg-info/SOURCES.txt
11
13
  batchfetch.egg-info/dependency_links.txt
12
14
  batchfetch.egg-info/entry_points.txt
13
15
  batchfetch.egg-info/requires.txt
14
- batchfetch.egg-info/top_level.txt
16
+ batchfetch.egg-info/top_level.txt
17
+ tests/test_helpers.py
18
+ tests/data/test-md5sum.txt
19
+ tests/data/test-run_simple.sh
@@ -0,0 +1,23 @@
1
+ #!/usr/bin/env bash
2
+ #
3
+ # Copyright (C) 2024 James Cherti
4
+ # URL: https://github.com/jamescherti/batchfetch
5
+ #
6
+ # This program is free software: you can redistribute it and/or modify it under
7
+ # the terms of the GNU General Public License as published by the Free Software
8
+ # Foundation, either version 3 of the License, or (at your option) any later
9
+ # version.
10
+ #
11
+ # This program is distributed in the hope that it will be useful, but WITHOUT
12
+ # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
13
+ # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
14
+ #
15
+ # You should have received a copy of the GNU General Public License along with
16
+ # this program. If not, see <https://www.gnu.org/licenses/>.
17
+ #
18
+ cd "$(dirname "${BASH_SOURCE[0]}")"
19
+ export PYTHONPATH="$(pwd)"
20
+ exec pytest -v -v --cov=batchfetch --cov=tests \
21
+ --cov-report=term \
22
+ --cov-report=html:htmlcov \
23
+ tests/test_*py
@@ -22,7 +22,7 @@ from setuptools import find_packages, setup
22
22
 
23
23
  setup(
24
24
  name="batchfetch",
25
- version="1.1.9",
25
+ version="1.2.1",
26
26
  packages=find_packages(),
27
27
  description="Efficiently clone and pull multiple Git repositories.",
28
28
  license="GPLv3",
@@ -0,0 +1,3 @@
1
+ Test 1.
2
+ Test 2.
3
+ Test 3.
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env bash
2
+
3
+ cd "$(dirname "${BASH_SOURCE[0]}")"
4
+ cat ./test-md5sum.txt
5
+ cat ./test-md5sum.txt | tail -n 1 >&2
@@ -0,0 +1,56 @@
1
+ #!/usr/bin/env python
2
+ #
3
+ # Copyright (C) 2024 James Cherti
4
+ # URL: https://github.com/jamescherti/batchfetch
5
+ #
6
+ # This program is free software: you can redistribute it and/or modify it under
7
+ # the terms of the GNU General Public License as published by the Free Software
8
+ # Foundation, either version 3 of the License, or (at your option) any later
9
+ # version.
10
+ #
11
+ # This program is distributed in the hope that it will be useful, but WITHOUT
12
+ # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
13
+ # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
14
+ #
15
+ # You should have received a copy of the GNU General Public License along with
16
+ # this program. If not, see <https://www.gnu.org/licenses/>.
17
+ #
18
+ """Unit tests."""
19
+
20
+ from pathlib import Path
21
+
22
+ from batchfetch import helpers
23
+
24
+ DATA_PATH = Path(".").joinpath("tests", "data").absolute()
25
+ SCRIPT_RUN_SIMPLE = DATA_PATH / "test-run_simple.sh"
26
+ TEST_MD5SUM_FILE = DATA_PATH / "test-md5sum.txt"
27
+
28
+
29
+ def test_md5sum():
30
+ md5sum = helpers.md5sum(TEST_MD5SUM_FILE)
31
+ assert md5sum == "f31e127edc87a6aa2eb01b7d94d2ec58"
32
+
33
+
34
+ def test_run_simple():
35
+ # Stdout
36
+ stdout_lines, stderr_lines = helpers.run_simple(str(SCRIPT_RUN_SIMPLE))
37
+ assert stdout_lines == ['Test 1.',
38
+ 'Test 2.',
39
+ 'Test 3.']
40
+ assert stderr_lines == ['Test 3.']
41
+
42
+
43
+ def test_indent_raw_output():
44
+ list_str = \
45
+ helpers.indent_raw_output(["Test 1.", "Test 2."])
46
+
47
+ assert list_str == [" Test 1.", " Test 2."]
48
+
49
+
50
+ def test_run_indent():
51
+ stdout_lines, stderr_lines = helpers.run_indent(str(SCRIPT_RUN_SIMPLE))
52
+ assert stdout_lines == [f' [RUN] {str(SCRIPT_RUN_SIMPLE)}',
53
+ ' Test 1.',
54
+ ' Test 2.',
55
+ ' Test 3.']
56
+ assert stderr_lines == [' Test 3.']
File without changes
File without changes