mirror of
https://github.com/josegonzalez/python-github-backup.git
synced 2025-12-06 00:28:01 +01:00
Compare commits
127 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0ebaffd102 | ||
|
|
2730fc3e5a | ||
|
|
0b2330c2c4 | ||
|
|
82e35fb1cf | ||
|
|
e8f027469e | ||
|
|
37ef0222e1 | ||
|
|
96a73b3fe8 | ||
|
|
8b1bfd433c | ||
|
|
cca8a851ad | ||
|
|
b5d749ec46 | ||
|
|
00e5c019db | ||
|
|
fbb977acf4 | ||
|
|
07e32b186c | ||
|
|
dcc90b747a | ||
|
|
f414fac108 | ||
|
|
38692bc836 | ||
|
|
81362e5596 | ||
|
|
753a26d0d6 | ||
|
|
b629a865f4 | ||
|
|
75ec773a6f | ||
|
|
f8a16ee0f8 | ||
|
|
3d5eb359e2 | ||
|
|
63441ebfbc | ||
|
|
7ad324225e | ||
|
|
885e94a102 | ||
|
|
9e1800f56e | ||
|
|
d057ee0d04 | ||
|
|
64562f2460 | ||
|
|
f7f9ffd017 | ||
|
|
048ef04e2a | ||
|
|
b1acfed83a | ||
|
|
18e78a4d66 | ||
|
|
1ed5427043 | ||
|
|
c2e3665ed8 | ||
|
|
0a30a92fe4 | ||
|
|
cc52587f52 | ||
|
|
853b7c46a1 | ||
|
|
e23d12d490 | ||
|
|
f8e1151111 | ||
|
|
664c2a765e | ||
|
|
fa7148d38f | ||
|
|
480ce3ce2a | ||
|
|
943e84e3d9 | ||
|
|
0c924c3158 | ||
|
|
f62c4eaf8b | ||
|
|
a53d7f6849 | ||
|
|
4e571d0735 | ||
|
|
5a71bc5e5a | ||
|
|
794ccf3996 | ||
|
|
977424c153 | ||
|
|
613576dd25 | ||
|
|
638bf7a77e | ||
|
|
725f2c3b8f | ||
|
|
41ece08152 | ||
|
|
3a5ef5158d | ||
|
|
cb1b0b6c6b | ||
|
|
d7f0747432 | ||
|
|
d411e20580 | ||
|
|
d7b85264cd | ||
|
|
031a984434 | ||
|
|
9e16f39e3e | ||
|
|
2de96390be | ||
|
|
78cff47a91 | ||
|
|
fa27988c1c | ||
|
|
bb2e2b8c6f | ||
|
|
8fd0f2b64f | ||
|
|
753a551961 | ||
|
|
607b6ca69b | ||
|
|
ef71655b01 | ||
|
|
d8bcbfa644 | ||
|
|
751b0d6e82 | ||
|
|
ea633ca2bb | ||
|
|
a2115ce3e5 | ||
|
|
8a00bb1903 | ||
|
|
e53f8d4724 | ||
|
|
356f5f674b | ||
|
|
13128635cb | ||
|
|
6e6842b025 | ||
|
|
272177c395 | ||
|
|
70f711ea68 | ||
|
|
3fc9957aac | ||
|
|
78098aae23 | ||
|
|
fb7cc5ed53 | ||
|
|
c0679b9cc3 | ||
|
|
03b9d1b2d8 | ||
|
|
5025f69878 | ||
|
|
a351cdc103 | ||
|
|
85e4399408 | ||
|
|
c8171b692a | ||
|
|
523c811cc6 | ||
|
|
857ad0afab | ||
|
|
3f65eadee1 | ||
|
|
a8e8841b26 | ||
|
|
8e542fd6b6 | ||
|
|
1865941b14 | ||
|
|
03c68561a5 | ||
|
|
196acd0aca | ||
|
|
679ac841f6 | ||
|
|
498d9eba32 | ||
|
|
0f82b1717c | ||
|
|
4d5126f303 | ||
|
|
b864218b44 | ||
|
|
98919c82c9 | ||
|
|
045eacbf18 | ||
|
|
7a234ba7ed | ||
|
|
e8a255b450 | ||
|
|
81a2f762da | ||
|
|
cb0293cbe5 | ||
|
|
252c25461f | ||
|
|
e8ed03fd06 | ||
|
|
38010d7c39 | ||
|
|
71b4288e6b | ||
|
|
ba4fa9fa2d | ||
|
|
869f761c90 | ||
|
|
195e700128 | ||
|
|
27441b71b6 | ||
|
|
cfeaee7309 | ||
|
|
fac8e4274f | ||
|
|
17fee66f31 | ||
|
|
a56d27dd8b | ||
|
|
e57873b6dd | ||
|
|
2658b039a1 | ||
|
|
fd684a71fb | ||
|
|
bacd77030b | ||
|
|
b73079daf2 | ||
|
|
eca8a70666 | ||
|
|
e74765ba7f |
23
.circleci/config.yml
Normal file
23
.circleci/config.yml
Normal file
@@ -0,0 +1,23 @@
|
||||
version: 2.1
|
||||
|
||||
orbs:
|
||||
python: circleci/python@0.3.2
|
||||
|
||||
jobs:
|
||||
build-and-test:
|
||||
executor: python/default
|
||||
steps:
|
||||
- checkout
|
||||
- python/load-cache
|
||||
- run:
|
||||
command: pip install flake8
|
||||
name: Install dependencies
|
||||
- python/save-cache
|
||||
- run:
|
||||
command: flake8 --ignore=E501
|
||||
name: Lint
|
||||
|
||||
workflows:
|
||||
main:
|
||||
jobs:
|
||||
- build-and-test
|
||||
117
.gitchangelog.rc
Normal file
117
.gitchangelog.rc
Normal file
@@ -0,0 +1,117 @@
|
||||
#
|
||||
# Format
|
||||
#
|
||||
# ACTION: [AUDIENCE:] COMMIT_MSG [@TAG ...]
|
||||
#
|
||||
# Description
|
||||
#
|
||||
# ACTION is one of 'chg', 'fix', 'new'
|
||||
#
|
||||
# Is WHAT the change is about.
|
||||
#
|
||||
# 'chg' is for refactor, small improvement, cosmetic changes...
|
||||
# 'fix' is for bug fixes
|
||||
# 'new' is for new features, big improvement
|
||||
#
|
||||
# SUBJECT is optional and one of 'dev', 'usr', 'pkg', 'test', 'doc'
|
||||
#
|
||||
# Is WHO is concerned by the change.
|
||||
#
|
||||
# 'dev' is for developpers (API changes, refactors...)
|
||||
# 'usr' is for final users (UI changes)
|
||||
# 'pkg' is for packagers (packaging changes)
|
||||
# 'test' is for testers (test only related changes)
|
||||
# 'doc' is for doc guys (doc only changes)
|
||||
#
|
||||
# COMMIT_MSG is ... well ... the commit message itself.
|
||||
#
|
||||
# TAGs are additionnal adjective as 'refactor' 'minor' 'cosmetic'
|
||||
#
|
||||
# 'refactor' is obviously for refactoring code only
|
||||
# 'minor' is for a very meaningless change (a typo, adding a comment)
|
||||
# 'cosmetic' is for cosmetic driven change (re-indentation, 80-col...)
|
||||
#
|
||||
# Example:
|
||||
#
|
||||
# new: usr: support of bazaar implemented
|
||||
# chg: re-indentend some lines @cosmetic
|
||||
# new: dev: updated code to be compatible with last version of killer lib.
|
||||
# fix: pkg: updated year of licence coverage.
|
||||
# new: test: added a bunch of test around user usability of feature X.
|
||||
# fix: typo in spelling my name in comment. @minor
|
||||
#
|
||||
# Please note that multi-line commit message are supported, and only the
|
||||
# first line will be considered as the "summary" of the commit message. So
|
||||
# tags, and other rules only applies to the summary. The body of the commit
|
||||
# message will be displayed in the changelog with minor reformating.
|
||||
|
||||
#
|
||||
# ``ignore_regexps`` is a line of regexps
|
||||
#
|
||||
# Any commit having its full commit message matching any regexp listed here
|
||||
# will be ignored and won't be reported in the changelog.
|
||||
#
|
||||
ignore_regexps = [
|
||||
r'(?i)^(Merge pull request|Merge branch|Release|Update)',
|
||||
]
|
||||
|
||||
|
||||
#
|
||||
# ``replace_regexps`` is a dict associating a regexp pattern and its replacement
|
||||
#
|
||||
# It will be applied to get the summary line from the full commit message.
|
||||
#
|
||||
# Note that you can provide multiple replacement patterns, they will be all
|
||||
# tried. If None matches, the summary line will be the full commit message.
|
||||
#
|
||||
replace_regexps = {
|
||||
# current format (ie: 'chg: dev: my commit msg @tag1 @tag2')
|
||||
|
||||
r'^([cC]hg|[fF]ix|[nN]ew)\s*:\s*((dev|use?r|pkg|test|doc)\s*:\s*)?([^\n@]*)(@[a-z]+\s+)*$':
|
||||
r'\4',
|
||||
}
|
||||
|
||||
|
||||
# ``section_regexps`` is a list of 2-tuples associating a string label and a
|
||||
# list of regexp
|
||||
#
|
||||
# Commit messages will be classified in sections thanks to this. Section
|
||||
# titles are the label, and a commit is classified under this section if any
|
||||
# of the regexps associated is matching.
|
||||
#
|
||||
section_regexps = [
|
||||
('New', [
|
||||
r'^[nN]ew\s*:\s*((dev|use?r|pkg|test|doc)\s*:\s*)?([^\n]*)$',
|
||||
]),
|
||||
('Changes', [
|
||||
r'^[cC]hg\s*:\s*((dev|use?r|pkg|test|doc)\s*:\s*)?([^\n]*)$',
|
||||
]),
|
||||
('Fix', [
|
||||
r'^[fF]ix\s*:\s*((dev|use?r|pkg|test|doc)\s*:\s*)?([^\n]*)$',
|
||||
]),
|
||||
('Other', None # Match all lines
|
||||
),
|
||||
|
||||
]
|
||||
|
||||
# ``body_split_regexp`` is a regexp
|
||||
#
|
||||
# Commit message body (not the summary) if existing will be split
|
||||
# (new line) on this regexp
|
||||
#
|
||||
body_split_regexp = r'[\n-]'
|
||||
|
||||
|
||||
# ``tag_filter_regexp`` is a regexp
|
||||
#
|
||||
# Tags that will be used for the changelog must match this regexp.
|
||||
#
|
||||
# tag_filter_regexp = r'^[0-9]+$'
|
||||
tag_filter_regexp = r'^(?:[vV])?[0-9\.]+$'
|
||||
|
||||
|
||||
# ``unreleased_version_label`` is a string
|
||||
#
|
||||
# This label will be used as the changelog Title of the last set of changes
|
||||
# between last valid tag and HEAD if any.
|
||||
unreleased_version_label = "%%version%% (unreleased)"
|
||||
19
.github/workflows/tagged-release.yml
vendored
Normal file
19
.github/workflows/tagged-release.yml
vendored
Normal file
@@ -0,0 +1,19 @@
|
||||
---
|
||||
name: "tagged-release"
|
||||
|
||||
# yamllint disable-line rule:truthy
|
||||
on:
|
||||
push:
|
||||
tags:
|
||||
- '*'
|
||||
|
||||
jobs:
|
||||
tagged-release:
|
||||
name: tagged-release
|
||||
runs-on: ubuntu-20.04
|
||||
|
||||
steps:
|
||||
- uses: "marvinpinto/action-automatic-releases@v1.2.1"
|
||||
with:
|
||||
repo_token: "${{ secrets.GITHUB_TOKEN }}"
|
||||
prerelease: false
|
||||
10
.gitignore
vendored
10
.gitignore
vendored
@@ -25,3 +25,13 @@ doc/_build
|
||||
|
||||
# Generated man page
|
||||
doc/aws_hostname.1
|
||||
|
||||
# Annoying macOS files
|
||||
.DS_Store
|
||||
._*
|
||||
|
||||
# IDE configuration files
|
||||
.vscode
|
||||
.atom
|
||||
|
||||
README
|
||||
255
CHANGES.rst
255
CHANGES.rst
@@ -1,9 +1,262 @@
|
||||
Changelog
|
||||
=========
|
||||
|
||||
0.24.0 (2019-06-27)
|
||||
0.43.0 (2023-05-29)
|
||||
-------------------
|
||||
------------------------
|
||||
|
||||
Fix
|
||||
~~~
|
||||
- Do not update readme. [Jose Diaz-Gonzalez]
|
||||
- Adjust for black. [Jose Diaz-Gonzalez]
|
||||
- Adjust for black. [Jose Diaz-Gonzalez]
|
||||
- Adjust for black. [Jose Diaz-Gonzalez]
|
||||
|
||||
Other
|
||||
~~~~~
|
||||
- Feat: commit gitchangelog.rc to repo so anyone can generate a
|
||||
changelog. [Jose Diaz-Gonzalez]
|
||||
- Feat: add release tagging. [Jose Diaz-Gonzalez]
|
||||
- Chore: formatting. [Jose Diaz-Gonzalez]
|
||||
- Chore: run black. [Jose Diaz-Gonzalez]
|
||||
- Add --log-level command line argument. [Enrico Tröger]
|
||||
|
||||
Support changing the log level to the desired value easily.
|
||||
For example, this is useful to suppress progress messages but
|
||||
keep logging warnings and errors.
|
||||
- Check both updated_at and pushed_at properties. [Ken Bailey]
|
||||
|
||||
Check both updated_at and pushed_at dates to get the last_update to reduce data retrieved on incremental api calls using since.
|
||||
|
||||
|
||||
0.42.0 (2022-11-28)
|
||||
-------------------
|
||||
- Add option to exclude repositories. [npounder]
|
||||
- Backup regular pull request comments as well. [Oneric]
|
||||
|
||||
Before, only review comments were backed up;
|
||||
regular comments need to be fetched via issue API.
|
||||
- Fix bug forever retry when request url error. [kornpisey]
|
||||
- Added --no-prune option to disable prune option when doing git fetch.
|
||||
[kornpisey]
|
||||
|
||||
|
||||
0.41.0 (2022-03-02)
|
||||
-------------------
|
||||
- Git lfs clone doe snot respect --mirror. [Louis Parisot]
|
||||
|
||||
|
||||
0.40.2 (2021-12-29)
|
||||
-------------------
|
||||
- Fix lint issues raised by Flake8. [atinary-afoulon]
|
||||
|
||||
According to job:
|
||||
[ https://app.circleci.com/pipelines/github/josegonzalez/python-github-backup/30/workflows/74eb93f2-2505-435d-b728-03b3cc04c14a/jobs/23 ]
|
||||
|
||||
Failed on the following checks:
|
||||
./github_backup/github_backup.py:20:1: F811 redefinition of unused 'logging' from line 14
|
||||
./github_backup/github_backup.py:45:1: E302 expected 2 blank lines, found 1
|
||||
./github_backup/github_backup.py:136:20: E251 unexpected spaces around keyword / parameter equals
|
||||
|
||||
|
||||
0.40.1 (2021-09-22)
|
||||
-------------------
|
||||
- Revert to fetch. [Harrison Wright]
|
||||
|
||||
|
||||
0.40.0 (2021-07-12)
|
||||
-------------------
|
||||
- Add retry on certain network errors. [Jacek Nykis]
|
||||
|
||||
This change includes certain network level errors in the retry logic.
|
||||
It partially address #110 but I think more comprehensive fix would be useful.
|
||||
- Pull changes from remote. [Jonas]
|
||||
|
||||
use `git pull` to pull actual files from the remote instead of using `fetch` for only the metadata
|
||||
|
||||
|
||||
0.39.0 (2021-03-19)
|
||||
-------------------
|
||||
|
||||
Fix
|
||||
~~~
|
||||
- Fix missing INFO logs. [Gallo Feliz]
|
||||
|
||||
Other
|
||||
~~~~~
|
||||
- Try to make compatible code with direct Python call ; reduce the hard
|
||||
link of the code with the cli. [Gallo Feliz]
|
||||
- Fixed release_name with slash bug. [Álvaro Torres Cogollo]
|
||||
|
||||
|
||||
0.38.0 (2021-02-13)
|
||||
-------------------
|
||||
|
||||
Fix
|
||||
~~~
|
||||
- Always clone with OAuth token when provided. [Samantha Baldwin]
|
||||
|
||||
Github Enterprise servers with 'Anonymous Git read access' disabled
|
||||
cause `git ls-remote` to fail (128) for a repo's `clone_url`. Using the
|
||||
OAuth token when provided allows cloning private AND public repos when
|
||||
Anonymous Git read access is disabled.
|
||||
|
||||
Other
|
||||
~~~~~
|
||||
- Change broken link to a fork to a working link to upstream. [Rick van
|
||||
Schijndel]
|
||||
|
||||
|
||||
0.37.2 (2021-01-02)
|
||||
-------------------
|
||||
|
||||
Fix
|
||||
~~~
|
||||
- Use distutils.core on error. [Jose Diaz-Gonzalez]
|
||||
|
||||
|
||||
0.37.1 (2021-01-02)
|
||||
-------------------
|
||||
|
||||
Fix
|
||||
~~~
|
||||
- Use twine for releases. [Jose Diaz-Gonzalez]
|
||||
|
||||
The old method of releasing to pypi broke for whatever reason and switching to a supported toolchain is easier than debugging the old one.
|
||||
|
||||
Additionally:
|
||||
|
||||
- Update gitchangelog
|
||||
- Fix license entry
|
||||
- Set long description type
|
||||
- Gitignore the temporary readme file
|
||||
|
||||
|
||||
0.37.0 (2021-01-02)
|
||||
-------------------
|
||||
- Add support for python 3.7 and 3.8 in package classifiers. [Albert
|
||||
Wang]
|
||||
- Remove support for python 2.7 in package classifiers. [Albert Wang]
|
||||
- Remove python 2 specific import logic. [Albert Wang]
|
||||
- Remove python 2 specific logic. [Albert Wang]
|
||||
- Add ability to skip archived repositories. [Gary Moon]
|
||||
|
||||
|
||||
0.36.0 (2020-08-29)
|
||||
-------------------
|
||||
- Add flake8 instructions to readme. [Albert Wang]
|
||||
- Fix regex string. [Albert Wang]
|
||||
- Fix whitespace issues. [Albert Wang]
|
||||
- Do not use bare excepts. [Albert Wang]
|
||||
- Add .circleci/config.yml. [Albert Wang]
|
||||
- Include --private flag in example. [wouter bolsterlee]
|
||||
|
||||
By default, private repositories are not included. This is surprising.
|
||||
It took me a while to figure this out, and making that clear in the
|
||||
example can help others to be aware of that.
|
||||
|
||||
|
||||
0.35.0 (2020-08-05)
|
||||
-------------------
|
||||
- Make API request throttling optional. [Samantha Baldwin]
|
||||
|
||||
|
||||
0.34.0 (2020-07-24)
|
||||
-------------------
|
||||
- Add logic for transforming gist repository urls to ssh. [Matt Fields]
|
||||
|
||||
|
||||
0.33.0 (2020-04-13)
|
||||
-------------------
|
||||
- Add basic API request throttling. [Enrico Tröger]
|
||||
|
||||
A simple approach to throttle API requests and so keep within the rate
|
||||
limits of the API. Can be enabled with "--throttle-limit" to specify
|
||||
when throttling should start.
|
||||
"--throttle-pause" defines the time to sleep between further API
|
||||
requests.
|
||||
|
||||
|
||||
0.32.0 (2020-04-13)
|
||||
-------------------
|
||||
- Add timestamp to log messages. [Enrico Tröger]
|
||||
|
||||
|
||||
0.31.0 (2020-02-25)
|
||||
-------------------
|
||||
- #123 update: changed --as-app 'help' description. [ethan]
|
||||
- #123: Support Authenticating As Github Application. [ethan]
|
||||
|
||||
|
||||
0.29.0 (2020-02-14)
|
||||
-------------------
|
||||
- #50 update: keep main() in bin. [ethan]
|
||||
- #50 - refactor for friendlier import. [ethan]
|
||||
|
||||
|
||||
0.28.0 (2020-02-03)
|
||||
-------------------
|
||||
- Remove deprecated (and removed) git lfs flags. [smiley]
|
||||
|
||||
"--tags" and "--force" were removed at some point from "git lfs fetch". This broke our backup script.
|
||||
|
||||
|
||||
0.27.0 (2020-01-22)
|
||||
-------------------
|
||||
- Fixed script fails if not installed from pip. [Ben Baron]
|
||||
|
||||
At the top of the script, the line from github_backup import __version__ gets the script's version number to use if the script is called with the -v or --version flags. The problem is that if the script hasn't been installed via pip (for example I cloned the repo directly to my backup server), the script will fail due to an import exception.
|
||||
|
||||
Also presumably it will always use the version number from pip even if running a modified version from git or a fork or something, though this does not fix that as I have no idea how to check if it's running the pip installed version or not. But at least the script will now work fine if cloned from git or just copied to another machine.
|
||||
|
||||
closes https://github.com/josegonzalez/python-github-backup/issues/141
|
||||
- Fixed macOS keychain access when using Python 3. [Ben Baron]
|
||||
|
||||
Python 3 is returning bytes rather than a string, so the string concatenation to create the auth variable was throwing an exception which the script was interpreting to mean it couldn't find the password. Adding a conversion to string first fixed the issue.
|
||||
- Public repos no longer include the auth token. [Ben Baron]
|
||||
|
||||
When backing up repositories using an auth token and https, the GitHub personal auth token is leaked in each backed up repository. It is included in the URL of each repository's git remote url.
|
||||
|
||||
This is not needed as they are public and can be accessed without the token and can cause issues in the future if the token is ever changed, so I think it makes more sense not to have the token stored in each repo backup. I think the token should only be "leaked" like this out of necessity, e.g. it's a private repository and the --prefer-ssh option was not chosen so https with auth token was required to perform the clone.
|
||||
- Fixed comment typo. [Ben Baron]
|
||||
- Switched log_info to log_warning in download_file. [Ben Baron]
|
||||
- Crash when an release asset doesn't exist. [Ben Baron]
|
||||
|
||||
Currently, the script crashes whenever a release asset is unable to download (for example a 404 response). This change instead logs the failure and allows the script to continue. No retry logic is enabled, but at least it prevents the crash and allows the backup to complete. Retry logic can be implemented later if wanted.
|
||||
|
||||
closes https://github.com/josegonzalez/python-github-backup/issues/129
|
||||
- Moved asset downloading loop inside the if block. [Ben Baron]
|
||||
- Separate release assets and skip re-downloading. [Ben Baron]
|
||||
|
||||
Currently the script puts all release assets into the same folder called `releases`. So any time 2 release files have the same name, only the last one downloaded is actually saved. A particularly bad example of this is MacDownApp/macdown where all of their releases are named `MacDown.app.zip`. So even though they have 36 releases and all 36 are downloaded, only the last one is actually saved.
|
||||
|
||||
With this change, each releases' assets are now stored in a fubfolder inside `releases` named after the release name. There could still be edge cases if two releases have the same name, but this is still much safer tha the previous behavior.
|
||||
|
||||
This change also now checks if the asset file already exists on disk and skips downloading it. This drastically speeds up addiotnal syncs as it no longer downloads every single release every single time. It will now only download new releases which I believe is the expected behavior.
|
||||
|
||||
closes https://github.com/josegonzalez/python-github-backup/issues/126
|
||||
- Added newline to end of file. [Ben Baron]
|
||||
- Improved gitignore, macOS files and IDE configs. [Ben Baron]
|
||||
|
||||
Ignores the annoying hidden macOS files .DS_Store and ._* as well as the IDE configuration folders for contributors using the popular Visual Studio Code and Atom IDEs (more can be added later as needed).
|
||||
|
||||
|
||||
0.26.0 (2019-09-23)
|
||||
-------------------
|
||||
- Workaround gist clone in `--prefer-ssh` mode. [Vladislav Yarmak]
|
||||
- Create PULL_REQUEST.md. [Jose Diaz-Gonzalez]
|
||||
- Create ISSUE_TEMPLATE.md. [Jose Diaz-Gonzalez]
|
||||
|
||||
|
||||
0.25.0 (2019-07-03)
|
||||
-------------------
|
||||
- Issue 119: Change retrieve_data to be a generator. [2a]
|
||||
|
||||
See issue #119.
|
||||
|
||||
|
||||
0.24.0 (2019-06-27)
|
||||
-------------------
|
||||
- QKT-45: include assets - update readme. [Ethan Timm]
|
||||
|
||||
update readme with flag information for including assets alongside their respective releases
|
||||
|
||||
13
ISSUE_TEMPLATE.md
Normal file
13
ISSUE_TEMPLATE.md
Normal file
@@ -0,0 +1,13 @@
|
||||
# Important notice regarding filed issues
|
||||
|
||||
This project already fills my needs, and as such I have no real reason to continue it's development. This project is otherwise provided as is, and no support is given.
|
||||
|
||||
If pull requests implementing bug fixes or enhancements are pushed, I am happy to review and merge them (time permitting).
|
||||
|
||||
If you wish to have a bug fixed, you have a few options:
|
||||
|
||||
- Fix it yourself and file a pull request.
|
||||
- File a bug and hope someone else fixes it for you.
|
||||
- Pay me to fix it (my rate is $200 an hour, minimum 1 hour, contact me via my [github email address](https://github.com/josegonzalez) if you want to go this route).
|
||||
|
||||
In all cases, feel free to file an issue, they may be of help to others in the future.
|
||||
7
PULL_REQUEST.md
Normal file
7
PULL_REQUEST.md
Normal file
@@ -0,0 +1,7 @@
|
||||
# Important notice regarding filed pull requests
|
||||
|
||||
This project already fills my needs, and as such I have no real reason to continue it's development. This project is otherwise provided as is, and no support is given.
|
||||
|
||||
I will attempt to review pull requests at _my_ earliest convenience. If I am unable to get to your pull request in a timely fashion, it is what it is. This repository does not pay any bills, and I am not required to merge any pull request from any individual.
|
||||
|
||||
If you wish to jump my personal priority queue, you may pay me for my time to review. My rate is $200 an hour - minimum 1 hour - feel free contact me via my github email address if you want to go this route.
|
||||
80
README.rst
80
README.rst
@@ -4,6 +4,8 @@ github-backup
|
||||
|
||||
|PyPI| |Python Versions|
|
||||
|
||||
This project is considered feature complete for the primary maintainer. If you would like a bugfix or enhancement and cannot sponsor the work, pull requests are welcome. Feel free to contact the maintainer for consulting estimates if desired.
|
||||
|
||||
backup a github user or organization
|
||||
|
||||
Requirements
|
||||
@@ -27,19 +29,20 @@ Usage
|
||||
|
||||
CLI Usage is as follows::
|
||||
|
||||
github-backup [-h] [-u USERNAME] [-p PASSWORD] [-t TOKEN]
|
||||
[-o OUTPUT_DIRECTORY] [-i] [--starred] [--all-starred]
|
||||
[--watched] [--followers] [--following] [--all]
|
||||
[--issues] [--issue-comments] [--issue-events] [--pulls]
|
||||
[--pull-comments] [--pull-commits] [--labels] [--hooks]
|
||||
[--milestones] [--repositories] [--releases] [--assets]
|
||||
[--bare] [--lfs] [--wikis] [--gists] [--starred-gists]
|
||||
[--skip-existing]
|
||||
[-L [LANGUAGES [LANGUAGES ...]]] [-N NAME_REGEX]
|
||||
[-H GITHUB_HOST] [-O] [-R REPOSITORY] [-P] [-F]
|
||||
[--prefer-ssh] [-v]
|
||||
github-backup [-h] [-u USERNAME] [-p PASSWORD] [-t TOKEN] [--as-app]
|
||||
[-o OUTPUT_DIRECTORY] [-l LOG_LEVEL] [-i] [--starred]
|
||||
[--all-starred] [--watched] [--followers] [--following]
|
||||
[--all] [--issues] [--issue-comments] [--issue-events]
|
||||
[--pulls] [--pull-comments] [--pull-commits]
|
||||
[--pull-details] [--labels] [--hooks] [--milestones]
|
||||
[--repositories] [--bare] [--lfs] [--wikis] [--gists]
|
||||
[--starred-gists] [--skip-archived] [--skip-existing]
|
||||
[-L [LANGUAGES ...]] [-N NAME_REGEX] [-H GITHUB_HOST]
|
||||
[-O] [-R REPOSITORY] [-P] [-F] [--prefer-ssh] [-v]
|
||||
[--keychain-name OSX_KEYCHAIN_ITEM_NAME]
|
||||
[--keychain-account OSX_KEYCHAIN_ITEM_ACCOUNT]
|
||||
[--releases] [--assets] [--exclude [REPOSITORY [REPOSITORY ...]]
|
||||
[--throttle-limit THROTTLE_LIMIT] [--throttle-pause THROTTLE_PAUSE]
|
||||
USER
|
||||
|
||||
Backup a github account
|
||||
@@ -55,36 +58,39 @@ CLI Usage is as follows::
|
||||
password for basic auth. If a username is given but
|
||||
not a password, the password will be prompted for.
|
||||
-t TOKEN, --token TOKEN
|
||||
personal access or OAuth token, or path to token
|
||||
(file://...)
|
||||
personal access, OAuth, or JSON Web token, or path to
|
||||
token (file://...)
|
||||
--as-app authenticate as github app instead of as a user.
|
||||
-o OUTPUT_DIRECTORY, --output-directory OUTPUT_DIRECTORY
|
||||
directory at which to backup the repositories
|
||||
-l LOG_LEVEL, --log-level LOG_LEVEL
|
||||
log level to use (default: info, possible levels:
|
||||
debug, info, warning, error, critical)
|
||||
-i, --incremental incremental backup
|
||||
--starred include JSON output of starred repositories in backup
|
||||
--all-starred include starred repositories in backup
|
||||
--watched include watched repositories in backup
|
||||
--all-starred include starred repositories in backup [*]
|
||||
--watched include JSON output of watched repositories in backup
|
||||
--followers include JSON output of followers in backup
|
||||
--following include JSON output of following users in backup
|
||||
--all include everything in backup
|
||||
--all include everything in backup (not including [*])
|
||||
--issues include issues in backup
|
||||
--issue-comments include issue comments in backup
|
||||
--issue-events include issue events in backup
|
||||
--pulls include pull requests in backup
|
||||
--pull-comments include pull request review comments in backup
|
||||
--pull-commits include pull request commits in backup
|
||||
--pull-details include more pull request details in backup [*]
|
||||
--labels include labels in backup
|
||||
--hooks include hooks in backup (works only when
|
||||
authenticated)
|
||||
--milestones include milestones in backup
|
||||
--repositories include repository clone in backup
|
||||
--releases include repository releases' information without assets or binaries
|
||||
--assets include assets alongside release information; only applies if including releases
|
||||
--bare clone bare repositories
|
||||
--lfs clone LFS repositories (requires Git LFS to be
|
||||
installed, https://git-lfs.github.com)
|
||||
installed, https://git-lfs.github.com) [*]
|
||||
--wikis include wiki clone in backup
|
||||
--gists include gists in backup
|
||||
--starred-gists include starred gists in backup
|
||||
--gists include gists in backup [*]
|
||||
--starred-gists include starred gists in backup [*]
|
||||
--skip-existing skip project if a backup directory exists
|
||||
-L [LANGUAGES [LANGUAGES ...]], --languages [LANGUAGES [LANGUAGES ...]]
|
||||
only allow these languages
|
||||
@@ -95,8 +101,8 @@ CLI Usage is as follows::
|
||||
-O, --organization whether or not this is an organization user
|
||||
-R REPOSITORY, --repository REPOSITORY
|
||||
name of repository to limit backup to
|
||||
-P, --private include private repositories
|
||||
-F, --fork include forked repositories
|
||||
-P, --private include private repositories [*]
|
||||
-F, --fork include forked repositories [*]
|
||||
--prefer-ssh Clone repositories using SSH instead of HTTPS
|
||||
-v, --version show program's version number and exit
|
||||
--keychain-name OSX_KEYCHAIN_ITEM_NAME
|
||||
@@ -105,6 +111,19 @@ CLI Usage is as follows::
|
||||
--keychain-account OSX_KEYCHAIN_ITEM_ACCOUNT
|
||||
OSX ONLY: account field of password item in OSX
|
||||
keychain that holds the personal access or OAuth token
|
||||
--releases include release information, not including assets or
|
||||
binaries
|
||||
--assets include assets alongside release information; only
|
||||
applies if including releases
|
||||
--exclude [REPOSITORY [REPOSITORY ...]]
|
||||
names of repositories to exclude from backup.
|
||||
--throttle-limit THROTTLE_LIMIT
|
||||
start throttling of GitHub API requests after this
|
||||
amount of API requests remain
|
||||
--throttle-pause THROTTLE_PAUSE
|
||||
wait this amount of seconds when API request
|
||||
throttling is active (default: 30.0, requires
|
||||
--throttle-limit to be set)
|
||||
|
||||
|
||||
The package can be used to backup an *entire* organization or repository, including issues and wikis in the most appropriate format (clones for wikis, json files for issues).
|
||||
@@ -139,10 +158,10 @@ Instructions on how to do this can be found on https://git-lfs.github.com.
|
||||
Examples
|
||||
========
|
||||
|
||||
Backup all repositories::
|
||||
Backup all repositories, including private ones::
|
||||
|
||||
export ACCESS_TOKEN=SOME-GITHUB-TOKEN
|
||||
github-backup WhiteHouse --token $ACCESS_TOKEN --organization --output-directory /tmp/white-house --repositories
|
||||
github-backup WhiteHouse --token $ACCESS_TOKEN --organization --output-directory /tmp/white-house --repositories --private
|
||||
|
||||
Backup a single organization repository with everything else (wiki, pull requests, comments, issues etc)::
|
||||
|
||||
@@ -152,7 +171,16 @@ Backup a single organization repository with everything else (wiki, pull request
|
||||
# e.g. git@github.com:docker/cli.git
|
||||
github-backup $ORGANIZATION -P -t $ACCESS_TOKEN -o . --all -O -R $REPO
|
||||
|
||||
Testing
|
||||
=======
|
||||
|
||||
This project currently contains no unit tests. To run linting::
|
||||
|
||||
pip install flake8
|
||||
flake8 --ignore=E501
|
||||
|
||||
|
||||
.. |PyPI| image:: https://img.shields.io/pypi/v/github-backup.svg
|
||||
:target: https://pypi.python.org/pypi/github-backup/
|
||||
.. |Python Versions| image:: https://img.shields.io/pypi/pyversions/github-backup.svg
|
||||
:target: https://github.com/albertyw/github-backup
|
||||
:target: https://github.com/josegonzalez/python-github-backup
|
||||
|
||||
1117
bin/github-backup
1117
bin/github-backup
File diff suppressed because it is too large
Load Diff
@@ -1 +1 @@
|
||||
__version__ = '0.24.0'
|
||||
__version__ = "0.43.0"
|
||||
|
||||
1357
github_backup/github_backup.py
Normal file
1357
github_backup/github_backup.py
Normal file
File diff suppressed because it is too large
Load Diff
22
release
22
release
@@ -6,7 +6,7 @@ if [[ ! -f setup.py ]]; then
|
||||
exit 1
|
||||
fi
|
||||
|
||||
PACKAGE_NAME="$(cat setup.py | grep "name='" | head | cut -d "'" -f2)"
|
||||
PACKAGE_NAME="$(cat setup.py | grep 'name="' | head | cut -d '"' -f2)"
|
||||
INIT_PACKAGE_NAME="$(echo "${PACKAGE_NAME//-/_}")"
|
||||
PUBLIC="true"
|
||||
|
||||
@@ -22,7 +22,7 @@ CYAN="\033[0;36m" # cyan
|
||||
pip install wheel > /dev/null
|
||||
|
||||
command -v gitchangelog >/dev/null 2>&1 || {
|
||||
echo -e "${RED}WARNING: Missing gitchangelog binary, please run: pip install gitchangelog==2.2.0${COLOR_OFF}\n"
|
||||
echo -e "${RED}WARNING: Missing gitchangelog binary, please run: pip install gitchangelog==3.0.4${COLOR_OFF}\n"
|
||||
exit 1
|
||||
}
|
||||
|
||||
@@ -31,6 +31,11 @@ command -v rst-lint > /dev/null || {
|
||||
exit 1
|
||||
}
|
||||
|
||||
command -v twine > /dev/null || {
|
||||
echo -e "${RED}WARNING: Missing twine binary, please run: pip install twine==3.2.0${COLOR_OFF}\n"
|
||||
exit 1
|
||||
}
|
||||
|
||||
if [[ "$@" != "major" ]] && [[ "$@" != "minor" ]] && [[ "$@" != "patch" ]]; then
|
||||
echo -e "${RED}WARNING: Invalid release type, must specify 'major', 'minor', or 'patch'${COLOR_OFF}\n"
|
||||
exit 1
|
||||
@@ -81,18 +86,12 @@ TMPFILE=$(mktemp /tmp/${tempfoo}.XXXXXX) || {
|
||||
exit 1
|
||||
}
|
||||
|
||||
find_this="__version__ = '$current_version'"
|
||||
replace_with="__version__ = '$next_version'"
|
||||
find_this="__version__ = \"$current_version\""
|
||||
replace_with="__version__ = \"$next_version\""
|
||||
|
||||
echo -e "${YELLOW}--->${COLOR_OFF} Updating ${INIT_PACKAGE_NAME}/__init__.py"
|
||||
sed "s/$find_this/$replace_with/" ${INIT_PACKAGE_NAME}/__init__.py > $TMPFILE && mv $TMPFILE ${INIT_PACKAGE_NAME}/__init__.py
|
||||
|
||||
find_this="${PACKAGE_NAME}.git@$current_version"
|
||||
replace_with="${PACKAGE_NAME}.git@$next_version"
|
||||
|
||||
echo -e "${YELLOW}--->${COLOR_OFF} Updating README.rst"
|
||||
sed "s/$find_this/$replace_with/" README.rst > $TMPFILE && mv $TMPFILE README.rst
|
||||
|
||||
if [ -f docs/conf.py ]; then
|
||||
echo -e "${YELLOW}--->${COLOR_OFF} Updating docs"
|
||||
find_this="version = '${current_version}'"
|
||||
@@ -125,7 +124,8 @@ git push -q origin master && git push -q --tags
|
||||
if [[ "$PUBLIC" == "true" ]]; then
|
||||
echo -e "${YELLOW}--->${COLOR_OFF} Creating python release"
|
||||
cp README.rst README
|
||||
python setup.py sdist bdist_wheel upload > /dev/null
|
||||
python setup.py sdist bdist_wheel > /dev/null
|
||||
twine upload dist/*
|
||||
rm README
|
||||
fi
|
||||
|
||||
|
||||
36
setup.py
36
setup.py
@@ -5,6 +5,7 @@ from github_backup import __version__
|
||||
|
||||
try:
|
||||
from setuptools import setup
|
||||
|
||||
setup # workaround for pyflakes issue #13
|
||||
except ImportError:
|
||||
from distutils.core import setup
|
||||
@@ -15,6 +16,7 @@ except ImportError:
|
||||
# http://www.eby-sarna.com/pipermail/peak/2010-May/003357.html)
|
||||
try:
|
||||
import multiprocessing
|
||||
|
||||
multiprocessing
|
||||
except ImportError:
|
||||
pass
|
||||
@@ -25,24 +27,26 @@ def open_file(fname):
|
||||
|
||||
|
||||
setup(
|
||||
name='github-backup',
|
||||
name="github-backup",
|
||||
version=__version__,
|
||||
author='Jose Diaz-Gonzalez',
|
||||
author_email='github-backup@josediazgonzalez.com',
|
||||
packages=['github_backup'],
|
||||
scripts=['bin/github-backup'],
|
||||
url='http://github.com/josegonzalez/python-github-backup',
|
||||
license=open('LICENSE.txt').read(),
|
||||
author="Jose Diaz-Gonzalez",
|
||||
author_email="github-backup@josediazgonzalez.com",
|
||||
packages=["github_backup"],
|
||||
scripts=["bin/github-backup"],
|
||||
url="http://github.com/josegonzalez/python-github-backup",
|
||||
license="MIT",
|
||||
classifiers=[
|
||||
'Development Status :: 5 - Production/Stable',
|
||||
'Topic :: System :: Archiving :: Backup',
|
||||
'License :: OSI Approved :: MIT License',
|
||||
'Programming Language :: Python :: 2.7',
|
||||
'Programming Language :: Python :: 3.5',
|
||||
'Programming Language :: Python :: 3.6',
|
||||
"Development Status :: 5 - Production/Stable",
|
||||
"Topic :: System :: Archiving :: Backup",
|
||||
"License :: OSI Approved :: MIT License",
|
||||
"Programming Language :: Python :: 3.5",
|
||||
"Programming Language :: Python :: 3.6",
|
||||
"Programming Language :: Python :: 3.7",
|
||||
"Programming Language :: Python :: 3.8",
|
||||
],
|
||||
description='backup a github user or organization',
|
||||
long_description=open_file('README.rst').read(),
|
||||
install_requires=open_file('requirements.txt').readlines(),
|
||||
description="backup a github user or organization",
|
||||
long_description=open_file("README.rst").read(),
|
||||
long_description_content_type="text/x-rst",
|
||||
install_requires=open_file("requirements.txt").readlines(),
|
||||
zip_safe=True,
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user