mirror of
https://github.com/josegonzalez/python-github-backup.git
synced 2026-04-26 02:25:36 +02:00
Compare commits
6 Commits
1750d0eff1
...
0.51.2
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
72d35a9b94 | ||
|
|
3eae9d78ed | ||
|
|
90ba839c7d | ||
|
|
1ec0820936 | ||
|
|
ca463e5cd4 | ||
|
|
a98ff7f23d |
118
CHANGES.rst
118
CHANGES.rst
@@ -1,10 +1,126 @@
|
||||
Changelog
|
||||
=========
|
||||
|
||||
0.51.0 (2025-11-06)
|
||||
0.51.2 (2025-11-16)
|
||||
-------------------
|
||||
------------------------
|
||||
|
||||
Fix
|
||||
~~~
|
||||
- Improve CA certificate detection with fallback chain. [Rodos]
|
||||
|
||||
The previous implementation incorrectly assumed empty get_ca_certs()
|
||||
meant broken SSL, causing false failures in GitHub Codespaces and other
|
||||
directory-based cert systems where certificates exist but aren't pre-loaded.
|
||||
It would then attempt to import certifi as a workaround, but certifi wasn't
|
||||
listed in requirements.txt, causing the fallback to fail with ImportError
|
||||
even though the system certificates would have worked fine.
|
||||
|
||||
This commit replaces the naive check with a layered fallback approach that
|
||||
checks multiple certificate sources. First it checks for pre-loaded system
|
||||
certs (file-based systems). Then it verifies system cert paths exist
|
||||
(directory-based systems like Ubuntu/Debian/Codespaces). Finally it attempts
|
||||
to use certifi as an optional fallback only if needed.
|
||||
|
||||
This approach eliminates hard dependencies (certifi is now optional), works
|
||||
in GitHub Codespaces without any setup, and fails gracefully with clear hints
|
||||
for resolution when SSL is actually broken rather than failing with
|
||||
ModuleNotFoundError.
|
||||
|
||||
Fixes #444
|
||||
|
||||
|
||||
0.51.1 (2025-11-16)
|
||||
-------------------
|
||||
|
||||
Fix
|
||||
~~~
|
||||
- Prevent duplicate attachment downloads. [Rodos]
|
||||
|
||||
Fixes bug where attachments were downloaded multiple times with
|
||||
incremented filenames (file.mov, file_1.mov, file_2.mov) when
|
||||
running backups without --skip-existing flag.
|
||||
|
||||
I should not have used the --skip-existing flag for attachments,
|
||||
it did not do what I thought it did.
|
||||
|
||||
The correct approach is to always use the manifest to guide what
|
||||
has already been downloaded and what now needs to be done.
|
||||
|
||||
Other
|
||||
~~~~~
|
||||
- Chore(deps): bump certifi in the python-packages group.
|
||||
[dependabot[bot]]
|
||||
|
||||
Bumps the python-packages group with 1 update: [certifi](https://github.com/certifi/python-certifi).
|
||||
|
||||
|
||||
Updates `certifi` from 2025.10.5 to 2025.11.12
|
||||
- [Commits](https://github.com/certifi/python-certifi/compare/2025.10.05...2025.11.12)
|
||||
|
||||
---
|
||||
updated-dependencies:
|
||||
- dependency-name: certifi
|
||||
dependency-version: 2025.11.12
|
||||
dependency-type: direct:production
|
||||
update-type: version-update:semver-minor
|
||||
dependency-group: python-packages
|
||||
...
|
||||
- Test: Add pytest infrastructure and attachment tests. [Rodos]
|
||||
|
||||
In making my last fix to attachments, I found it challenging not
|
||||
having tests to ensure there was no regression.
|
||||
|
||||
Added pytest with minimal setup and isolated configuration. Created
|
||||
a separate test workflow to keep tests isolated from linting.
|
||||
|
||||
Tests cover the key elements of the attachment logic:
|
||||
- URL extraction from issue bodies
|
||||
- Filename extraction from different URL types
|
||||
- Filename collision resolution
|
||||
- Manifest duplicate prevention
|
||||
- Chore(deps): bump black in the python-packages group.
|
||||
[dependabot[bot]]
|
||||
|
||||
Bumps the python-packages group with 1 update: [black](https://github.com/psf/black).
|
||||
|
||||
|
||||
Updates `black` from 25.9.0 to 25.11.0
|
||||
- [Release notes](https://github.com/psf/black/releases)
|
||||
- [Changelog](https://github.com/psf/black/blob/main/CHANGES.md)
|
||||
- [Commits](https://github.com/psf/black/compare/25.9.0...25.11.0)
|
||||
|
||||
---
|
||||
updated-dependencies:
|
||||
- dependency-name: black
|
||||
dependency-version: 25.11.0
|
||||
dependency-type: direct:production
|
||||
update-type: version-update:semver-minor
|
||||
dependency-group: python-packages
|
||||
...
|
||||
- Chore(deps): bump docutils in the python-packages group.
|
||||
[dependabot[bot]]
|
||||
|
||||
Bumps the python-packages group with 1 update: [docutils](https://github.com/rtfd/recommonmark).
|
||||
|
||||
|
||||
Updates `docutils` from 0.22.2 to 0.22.3
|
||||
- [Changelog](https://github.com/readthedocs/recommonmark/blob/master/CHANGELOG.md)
|
||||
- [Commits](https://github.com/rtfd/recommonmark/commits)
|
||||
|
||||
---
|
||||
updated-dependencies:
|
||||
- dependency-name: docutils
|
||||
dependency-version: 0.22.3
|
||||
dependency-type: direct:production
|
||||
update-type: version-update:semver-patch
|
||||
dependency-group: python-packages
|
||||
...
|
||||
|
||||
|
||||
0.51.0 (2025-11-06)
|
||||
-------------------
|
||||
|
||||
Fix
|
||||
~~~
|
||||
- Remove Python 3.8 and 3.9 from CI matrix. [Rodos]
|
||||
|
||||
@@ -1 +1 @@
|
||||
__version__ = "0.51.0"
|
||||
__version__ = "0.51.2"
|
||||
|
||||
@@ -37,22 +37,33 @@ FNULL = open(os.devnull, "w")
|
||||
FILE_URI_PREFIX = "file://"
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
# Setup SSL context with fallback chain
|
||||
https_ctx = ssl.create_default_context()
|
||||
if not https_ctx.get_ca_certs():
|
||||
import warnings
|
||||
if https_ctx.get_ca_certs():
|
||||
# Layer 1: Certificates pre-loaded from system (file-based)
|
||||
pass
|
||||
else:
|
||||
paths = ssl.get_default_verify_paths()
|
||||
if (paths.cafile and os.path.exists(paths.cafile)) or (
|
||||
paths.capath and os.path.exists(paths.capath)
|
||||
):
|
||||
# Layer 2: Cert paths exist, will be lazy-loaded on first use (directory-based)
|
||||
pass
|
||||
else:
|
||||
# Layer 3: Try certifi package as optional fallback
|
||||
try:
|
||||
import certifi
|
||||
|
||||
warnings.warn(
|
||||
"\n\nYOUR DEFAULT CA CERTS ARE EMPTY.\n"
|
||||
+ "PLEASE POPULATE ANY OF:"
|
||||
+ "".join(
|
||||
["\n - " + x for x in ssl.get_default_verify_paths() if type(x) is str]
|
||||
)
|
||||
+ "\n",
|
||||
stacklevel=2,
|
||||
)
|
||||
import certifi
|
||||
|
||||
https_ctx = ssl.create_default_context(cafile=certifi.where())
|
||||
https_ctx = ssl.create_default_context(cafile=certifi.where())
|
||||
except ImportError:
|
||||
# All layers failed - no certificates available anywhere
|
||||
sys.exit(
|
||||
"\nERROR: No CA certificates found. Cannot connect to GitHub over SSL.\n\n"
|
||||
"Solutions you can explore:\n"
|
||||
" 1. pip install certifi\n"
|
||||
" 2. Alpine: apk add ca-certificates\n"
|
||||
" 3. Debian/Ubuntu: apt-get install ca-certificates\n\n"
|
||||
)
|
||||
|
||||
|
||||
def logging_subprocess(
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
autopep8==2.3.2
|
||||
black==25.11.0
|
||||
bleach==6.3.0
|
||||
certifi==2025.10.5
|
||||
certifi==2025.11.12
|
||||
charset-normalizer==3.4.4
|
||||
click==8.3.0
|
||||
colorama==0.4.6
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
|
||||
|
||||
Reference in New Issue
Block a user