earwig / git-repo-updater Goto Github PK
View Code? Open in Web Editor NEWA console script that allows you to easily update multiple git repositories at once
License: MIT License
A console script that allows you to easily update multiple git repositories at once
License: MIT License
I think would be very usefull if there're was a way to perform a "npm install" after pulling changes from the remote.
I know not everybody uses npm, so I guess we can add support for yaml, for example, also, and perform a check of what package manager is being used, and call proper command.
I would like to implement this behaviour, I would like to know what do you think will be the better way to do this.
Thanks for your time, Damian.
Should have this, if people are running it under Python 3 interpreters.
Probably won't be hard to support, but need to check dependencies.
Hi ! Thanks for this nice tool. Mostly works fine but only issue I have is that bookmarks doesn't work on windows with python2. When I add a path, it gets added to the config.ini file but when I run gitup, it just exits with Error: C doesn't exist
The issue seems to be with python2 configparser treating colons as delimiters. I did a pip install configparser
(it installed v3.3.0r2) and it works fine now.
Maybe add it to setup.py?
I have a directory full of bare repos (i.e. mirrors), and getup fails to update them:
Traceback (most recent call last):
File "/usr/local/Cellar/gitup/0.2.3/libexec/bin/gitup", line 9, in
load_entry_point('gitup==0.2.3', 'console_scripts', 'gitup')()
File "/usr/local/Cellar/gitup/0.2.3/libexec/lib/python2.7/site-packages/gitup/script.py", line 90, in run
main()
File "/usr/local/Cellar/gitup/0.2.3/libexec/lib/python2.7/site-packages/gitup/script.py", line 82, in main
update_directories(args.directories_to_update, update_args)
File "/usr/local/Cellar/gitup/0.2.3/libexec/lib/python2.7/site-packages/gitup/update.py", line 296, in update_directories
_update_directory(full_path, update_args, is_bookmark=False)
File "/usr/local/Cellar/gitup/0.2.3/libexec/lib/python2.7/site-packages/gitup/update.py", line 275, in _update_directory
_update_subdirectories(path, long_name, update_args)
File "/usr/local/Cellar/gitup/0.2.3/libexec/lib/python2.7/site-packages/gitup/update.py", line 256, in _update_subdirectories
_update_repository(repo, _update_args)
File "/usr/local/Cellar/gitup/0.2.3/libexec/lib/python2.7/site-packages/gitup/update.py", line 240, in _update_repository
_update_branches(repo, active, merge, rebase)
File "/usr/local/Cellar/gitup/0.2.3/libexec/lib/python2.7/site-packages/gitup/update.py", line 207, in _update_branches
active.checkout()
File "/usr/local/Cellar/gitup/0.2.3/libexec/vendor/lib/python2.7/site-packages/git/refs/head.py", line 219, in checkout
self.repo.git.checkout(self, *_kwargs)
File "/usr/local/Cellar/gitup/0.2.3/libexec/vendor/lib/python2.7/site-packages/git/cmd.py", line 440, in
return lambda _args, *_kwargs: self._call_process(name, _args, *_kwargs)
File "/usr/local/Cellar/gitup/0.2.3/libexec/vendor/lib/python2.7/site-packages/git/cmd.py", line 834, in _call_process
return self.execute(make_call(), **_kwargs)
File "/usr/local/Cellar/gitup/0.2.3/libexec/vendor/lib/python2.7/site-packages/git/cmd.py", line 627, in execute
raise GitCommandError(command, status, stderr_value)
git.exc.GitCommandError: 'git checkout master' returned with exit code 128
Hi,
i'm calling the tool with the command "python -m gitup . --prune" (the same result with "gitup . --prune"), but it doesn't perform prune command. No matter how many times I run it, the old branches are kept. Example message: Updating fix/XXXX-74/reviewsNotReturned: skipped: upstream does not exist.
Do I understand correctly, that --prune should remove those branches?
I've had a relatively good time using GitPython, so it would be nice to switch to that over the current raw-shell-command approach.
Windows 10E
Running python 2.7 x86
Any ideas?
Microsoft Windows [Version 10.0.14393]
(c) 2016 Microsoft Corporation. All rights reserved.
C:\Users\Administrator>cd c:\
c:\>git clone git://github.com/earwig/git-repo-updater.git
Cloning into 'git-repo-updater'...
remote: Counting objects: 413, done.
Receiving objects: 87% (360/413) 0 (delta 0), pack-reused 413R
Receiving objects: 100% (413/413), 94.97 KiB | 0 bytes/s, done.
Resolving deltas: 100% (251/251), done.
c:\>cd git-repo-updater
c:\git-repo-updater>python setup.py install
Traceback (most recent call last):
File "setup.py", line 8, in <module>
from setuptools import setup, find_packages
File "C:\Python27\lib\site-packages\setuptools\__init__.py", line 23, in <module>
__version__ = setuptools.version.__version__
AttributeError: 'module' object has no attribute '__version__'
c:\git-repo-updater>python setup.py install --user
Traceback (most recent call last):
File "setup.py", line 8, in <module>
from setuptools import setup, find_packages
File "C:\Python27\lib\site-packages\setuptools\__init__.py", line 23, in <module>
__version__ = setuptools.version.__version__
AttributeError: 'module' object has no attribute '__version__'
c:\git-repo-updater>
Is there any way to have this automatically delete repositories that no longer exist?
Example of current:
git_checkout:
Fetching origin: error: Could not read from remote repository. Please ma
ke sure you have the correct access rights and the repository exists.
Updating master: up to date.
could you make a new release?
v0.6 or v0.5.1
Any Option to ignore some folders on recursive search for git repositories?
From git master HEAD:
$gitup --add ~/myrepo
Traceback (most recent call last):
File "/usr/local/bin/gitup", line 9, in <module>
load_entry_point('gitup==0.3', 'console_scripts', 'gitup')()
File "/usr/local/lib/python3.4/dist-packages/gitup-0.3-py3.4.egg/gitup/script.py", line 100, in run
File "/usr/local/lib/python3.4/dist-packages/gitup-0.3-py3.4.egg/gitup/script.py", line 83, in main
File "/usr/local/lib/python3.4/dist-packages/gitup-0.3-py3.4.egg/gitup/config.py", line 84, in add_bookmarks
File "/usr/local/lib/python3.4/dist-packages/gitup-0.3-py3.4.egg/gitup/config.py", line 59, in _save_config_file
File "/usr/lib/python3.4/configparser.py", line 897, in write
self._sections[section].items(), d)
File "/usr/lib/python3.4/configparser.py", line 901, in _write_section
fp.write("[{}]\n".format(section_name))
TypeError: 'str' does not support the buffer interface
Hello and thanks for such a great product!
For users who has a lot of old repos it would be really handy to have a flag to skip broken repos or repos with outdated auth.
Thanks!
Hi, it's not working for me, I have this error when I try to update all my repo.
Regards
Frédéric
$ gitup ~/workspace/longback ⏎
gitup: the git-repo-updater
Directory "/home/lo/workspace/longback" contains 13 git repositories:
babylon:
Fetching originTraceback (most recent call last):
File "/usr/local/bin/gitup", line 9, in <module>
load_entry_point('gitup==0.2.3', 'console_scripts', 'gitup')()
File "build/bdist.linux-x86_64/egg/gitup/script.py", line 90, in run
File "build/bdist.linux-x86_64/egg/gitup/script.py", line 82, in main
File "build/bdist.linux-x86_64/egg/gitup/update.py", line 296, in update_directories
File "build/bdist.linux-x86_64/egg/gitup/update.py", line 275, in _update_directory
File "build/bdist.linux-x86_64/egg/gitup/update.py", line 256, in _update_subdirectories
File "build/bdist.linux-x86_64/egg/gitup/update.py", line 239, in _update_repository
File "build/bdist.linux-x86_64/egg/gitup/update.py", line 98, in _fetch_remotes
File "/usr/local/lib/python2.7/dist-packages/GitPython-1.0.1-py2.7.egg/git/remote.py", line 651, in fetch
res = self._get_fetch_info_from_stderr(proc, progress or RemoteProgress())
File "/usr/local/lib/python2.7/dist-packages/GitPython-1.0.1-py2.7.egg/git/remote.py", line 588, in _get_fetch_info_from_stderr
for err_line, fetch_line in zip(fetch_info_lines, fetch_head_info))
File "/usr/local/lib/python2.7/dist-packages/GitPython-1.0.1-py2.7.egg/git/remote.py", line 588, in <genexpr>
for err_line, fetch_line in zip(fetch_info_lines, fetch_head_info))
File "/usr/local/lib/python2.7/dist-packages/GitPython-1.0.1-py2.7.egg/git/remote.py", line 241, in _from_line
raise ValueError("Failed to parse line: %r" % line)
ValueError: Failed to parse line: u' = [\xe0 jour] develop -> origin/develop'
I’m using Gitup 0.4 on macOS 10.12.6. I have a clone of a public repository from GitHub, and when I try to update it I get
/Users/bdesham/Compute/spectomic (1 repo):
spectomic:
Fetching origin: error: git.
Traceback (most recent call last):
File "/usr/local/Cellar/gitup/0.4/libexec/bin/gitup", line 9, in <module>
load_entry_point('gitup==0.4', 'console_scripts', 'gitup')()
File "/usr/local/Cellar/gitup/0.4/libexec/lib/python2.7/site-packages/gitup/script.py", line 137, in run
main()
File "/usr/local/Cellar/gitup/0.4/libexec/lib/python2.7/site-packages/gitup/script.py", line 129, in main
update_directories(args.directories_to_update, update_args)
File "/usr/local/Cellar/gitup/0.4/libexec/lib/python2.7/site-packages/gitup/update.py", line 254, in update_directories
_dispatch(path, _update_repository, *update_args)
File "/usr/local/Cellar/gitup/0.4/libexec/lib/python2.7/site-packages/gitup/update.py", line 240, in _dispatch
callback(repo, *args)
File "/usr/local/Cellar/gitup/0.4/libexec/lib/python2.7/site-packages/gitup/update.py", line 178, in _update_repository
for branch in sorted(repo.heads, key=lambda b: b.name):
File "/usr/local/Cellar/gitup/0.4/libexec/vendor/lib/python2.7/site-packages/git/repo/base.py", line 228, in heads
return Head.list_items(self)
File "/usr/local/Cellar/gitup/0.4/libexec/vendor/lib/python2.7/site-packages/git/util.py", line 932, in list_items
out_list.extend(cls.iter_items(repo, *args, **kwargs))
File "/usr/local/Cellar/gitup/0.4/libexec/vendor/lib/python2.7/site-packages/git/refs/symbolic.py", line 592, in _iter_items
for sha, rela_path in cls._iter_packed_refs(repo): # @UnusedVariable
File "/usr/local/Cellar/gitup/0.4/libexec/vendor/lib/python2.7/site-packages/git/refs/symbolic.py", line 92, in _iter_packed_refs
raise TypeError("PackingType of packed-Refs not understood: %r" % line)
TypeError: PackingType of packed-Refs not understood: '# pack-refs with: peeled fully-peeled sorted'
Thanks to Homebrew, I have tried this with Git versions 2.14.2, 2.14.3, and 2.15.0, but the behavior is the same in each case. The only problem seems to be this GitHub repo; I can update my clones of some self-hosted GitLab repos and a non-hosted repo without a problem.
Edit: I did get this problem on a GitHub repo but I’ve since seen it on repos on my company’s self-hosted GitLab installation too. Weirdly, some of the repos from GitLab have updated without a problem. I can’t see a pattern in which repositories can update and which can’t.
Just checked out and installed 845156c.
Ran gitup
, it "updated" two repos which had no remote changes, and then:
CouchPotatoServer:
Fetching origin (1624/1624, 3414/3414)error: something went wrong in GitPython, but the fetch might have been successful.
Traceback (most recent call last):
File "/Users/km/python/bin/gitup", line 9, in <module>
load_entry_point('gitup==0.2', 'console_scripts', 'gitup')()
File "build/bdist.macosx-10.9-x86_64/egg/gitup/script.py", line 90, in run
File "build/bdist.macosx-10.9-x86_64/egg/gitup/script.py", line 85, in main
File "build/bdist.macosx-10.9-x86_64/egg/gitup/update.py", line 274, in update_bookmarks
File "build/bdist.macosx-10.9-x86_64/egg/gitup/update.py", line 261, in _update_directory
File "build/bdist.macosx-10.9-x86_64/egg/gitup/update.py", line 242, in _update_subdirectories
File "build/bdist.macosx-10.9-x86_64/egg/gitup/update.py", line 225, in _update_repository
File "build/bdist.macosx-10.9-x86_64/egg/gitup/update.py", line 104, in _fetch_remotes
UnboundLocalError: local variable 'results' referenced before assignment
Quite often I'm in a situation where people create a lot of branches in the main repo and open a pull-request. Later on, those branches get deleted.
At the moment, I have to do "git remote update --prune" every time the number of branches no longer on the remote but not tracked locally gets out of hand. Is there any scope to add this into a normal "gitup" run too?
Occasionally, if I haven't used gitup for some time and I run it, it will end with a "too many open files" error. I believe this is due to file handles not being closed after usage, but I can't be sure -- I haven't dug into the code.
Here's a sample error:
rancid:
Fetching origin (6/6)Traceback (most recent call last):
File "/usr/local/Cellar/gitup/0.3/libexec/bin/gitup", line 9, in <module>
load_entry_point('gitup==0.3', 'console_scripts', 'gitup')()
File "/usr/local/Cellar/gitup/0.3/libexec/lib/python2.7/site-packages/gitup/script.py", line 100, in run
main()
File "/usr/local/Cellar/gitup/0.3/libexec/lib/python2.7/site-packages/gitup/script.py", line 95, in main
update_bookmarks(get_bookmarks(), update_args)
File "/usr/local/Cellar/gitup/0.3/libexec/lib/python2.7/site-packages/gitup/update.py", line 212, in update_bookmarks
_update_directory(path, update_args)
File "/usr/local/Cellar/gitup/0.3/libexec/lib/python2.7/site-packages/gitup/update.py", line 201, in _update_directory
_update_subdirectories(path, update_args)
File "/usr/local/Cellar/gitup/0.3/libexec/lib/python2.7/site-packages/gitup/update.py", line 185, in _update_subdirectories
_update_repository(repo, *update_args)
File "/usr/local/Cellar/gitup/0.3/libexec/lib/python2.7/site-packages/gitup/update.py", line 166, in _update_repository
_fetch_remotes(remotes)
File "/usr/local/Cellar/gitup/0.3/libexec/lib/python2.7/site-packages/gitup/update.py", line 75, in _fetch_remotes
results = remote.fetch(progress=_ProgressMonitor())
File "/usr/local/Cellar/gitup/0.3/libexec/vendor/lib/python2.7/site-packages/git/remote.py", line 651, in fetch
res = self._get_fetch_info_from_stderr(proc, progress or RemoteProgress())
File "/usr/local/Cellar/gitup/0.3/libexec/vendor/lib/python2.7/site-packages/git/remote.py", line 588, in _get_fetch_info_from_stderr
for err_line, fetch_line in zip(fetch_info_lines, fetch_head_info))
File "/usr/local/Cellar/gitup/0.3/libexec/vendor/lib/python2.7/site-packages/git/remote.py", line 588, in <genexpr>
for err_line, fetch_line in zip(fetch_info_lines, fetch_head_info))
File "/usr/local/Cellar/gitup/0.3/libexec/vendor/lib/python2.7/site-packages/git/remote.py", line 276, in _from_line
old_commit = repo.rev_parse(operation.split(split_token)[0])
File "/usr/local/Cellar/gitup/0.3/libexec/vendor/lib/python2.7/site-packages/git/repo/fun.py", line 304, in rev_parse
obj = name_to_object(repo, rev)
File "/usr/local/Cellar/gitup/0.3/libexec/vendor/lib/python2.7/site-packages/git/repo/fun.py", line 89, in name_to_object
hexsha = short_to_long(repo.odb, name)
File "/usr/local/Cellar/gitup/0.3/libexec/vendor/lib/python2.7/site-packages/git/repo/fun.py", line 70, in short_to_long
return bin_to_hex(odb.partial_to_complete_sha_hex(hexsha))
File "/usr/local/Cellar/gitup/0.3/libexec/vendor/lib/python2.7/site-packages/gitdb/db/base.py", line 258, in partial_to_complete_sha_hex
full_bin_sha = db.partial_to_complete_sha(partial_binsha, len_partial_hexsha)
File "/usr/local/Cellar/gitup/0.3/libexec/vendor/lib/python2.7/site-packages/gitdb/db/pack.py", line 192, in partial_to_complete_sha
item_index = item[1].index().partial_sha_to_index(partial_binsha, canonical_length)
File "/usr/local/Cellar/gitup/0.3/libexec/vendor/lib/python2.7/site-packages/gitdb/pack.py", line 459, in partial_sha_to_index
get_sha = self.sha
File "/usr/local/Cellar/gitup/0.3/libexec/vendor/lib/python2.7/site-packages/gitdb/util.py", line 237, in __getattr__
self._set_cache_(attr)
File "/usr/local/Cellar/gitup/0.3/libexec/vendor/lib/python2.7/site-packages/gitdb/pack.py", line 289, in _set_cache_
mmap = self._cursor.map()
File "/usr/local/Cellar/gitup/0.3/libexec/vendor/lib/python2.7/site-packages/gitdb/util.py", line 237, in __getattr__
self._set_cache_(attr)
File "/usr/local/Cellar/gitup/0.3/libexec/vendor/lib/python2.7/site-packages/gitdb/pack.py", line 278, in _set_cache_
self._cursor = mman.make_cursor(self._indexpath).use_region()
File "/usr/local/Cellar/gitup/0.3/libexec/vendor/lib/python2.7/site-packages/smmap/mman.py", line 129, in use_region
self._region = man._obtain_region(self._rlist, offset, size, flags, False)
File "/usr/local/Cellar/gitup/0.3/libexec/vendor/lib/python2.7/site-packages/smmap/mman.py", line 573, in _obtain_region
return self._obtain_region(a, offset, size, flags, True)
File "/usr/local/Cellar/gitup/0.3/libexec/vendor/lib/python2.7/site-packages/smmap/mman.py", line 561, in _obtain_region
r = self.MapRegionCls(a.path_or_fd(), mid.ofs, mid.size, flags)
File "/usr/local/Cellar/gitup/0.3/libexec/vendor/lib/python2.7/site-packages/smmap/util.py", line 167, in __init__
self._mf = mmap(fd, actual_size, **kwargs)
mmap.error: [Errno 24] Too many open files
It happens when I have approx 20+ git repos in a directory, and only the parent is added to gitup, rather than each repo individually. It also doesn't happen every time, it only happens sometimes -- and generally if there's a lot of changes.
This is on the latest OSX, using version 0.3 from homebrew.
This was probably just a git version issue, but the git status command on my env (MAC OS X, git version 1.8.2.3, hub version 1.10.6) was returning "nothing to commit, working directory clean". The updater script was expecting "nothing to commit (working directory clean)"
This repo updater worked fine after I manually changed the status string check and re-installed.
GitUp installs their Command Line Tools simlink over git-repo-updater.
See build log here.
See PyOxidizer Issue 69 : Stop requiring __file__
in Python packages
I am trying to use git-repo-updater with PyOxidizer.
Finished dev [unoptimized + debuginfo] target(s) in 1m 29s
writing executable to C:\Lab\PyOxidizer\git-repo-updator\.\build\x86_64-pc-windows-msvc\debug\exe\git-repo-updator.exe
>>> from gitup.cli import run
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "gitup.cli", line 18, in <module>
File "gitup.update", line 15, in <module>
File "git", line 33, in <module>
File "git", line 22, in _init_externals
NameError: name '__file__' is not defined
>>>
git-repo-updater uses GitPython package : git-repo-updater setup.py, git-repo-updater source file
Traceback (most recent call last):
File "/usr/local/Cellar/gitup/0.3/libexec/bin/gitup", line 9, in
load_entry_point('gitup==0.3', 'console_scripts', 'gitup')()
File "/usr/local/Cellar/gitup/0.3/libexec/lib/python2.7/site-packages/gitup/script.py", line 100, in run
main()
File "/usr/local/Cellar/gitup/0.3/libexec/lib/python2.7/site-packages/gitup/script.py", line 92, in main
update_directories(args.directories_to_update, update_args)
File "/usr/local/Cellar/gitup/0.3/libexec/lib/python2.7/site-packages/gitup/update.py", line 220, in update_directories
_update_directory(full_path, update_args)
File "/usr/local/Cellar/gitup/0.3/libexec/lib/python2.7/site-packages/gitup/update.py", line 201, in _update_directory
_update_subdirectories(path, update_args)
File "/usr/local/Cellar/gitup/0.3/libexec/lib/python2.7/site-packages/gitup/update.py", line 185, in _update_subdirectories
_update_repository(repo, *update_args)
File "/usr/local/Cellar/gitup/0.3/libexec/lib/python2.7/site-packages/gitup/update.py", line 166, in _update_repository
_fetch_remotes(remotes)
File "/usr/local/Cellar/gitup/0.3/libexec/lib/python2.7/site-packages/gitup/update.py", line 75, in _fetch_remotes
results = remote.fetch(progress=_ProgressMonitor())
File "/usr/local/Cellar/gitup/0.3/libexec/vendor/lib/python2.7/site-packages/git/remote.py", line 643, in fetch
kwargs = add_progress(kwargs, self.repo.git, progress)
File "/usr/local/Cellar/gitup/0.3/libexec/vendor/lib/python2.7/site-packages/git/remote.py", line 51, in add_progress
v = git.version_info
File "/usr/local/Cellar/gitup/0.3/libexec/vendor/lib/python2.7/site-packages/git/cmd.py", line 462, in version_info
return self._version_info
File "/usr/local/Cellar/gitup/0.3/libexec/vendor/lib/python2.7/site-packages/git/cmd.py", line 439, in getattr
return LazyMixin.getattr(self, name)
File "/usr/local/Cellar/gitup/0.3/libexec/vendor/lib/python2.7/site-packages/gitdb/util.py", line 237, in getattr
self.set_cache(attr)
File "/usr/local/Cellar/gitup/0.3/libexec/vendor/lib/python2.7/site-packages/git/cmd.py", line 445, in set_cache
version_numbers = self._call_process('version').split(' ')[2]
File "/usr/local/Cellar/gitup/0.3/libexec/vendor/lib/python2.7/site-packages/git/cmd.py", line 834, in _call_process
return self.execute(make_call(), **_kwargs)
File "/usr/local/Cellar/gitup/0.3/libexec/vendor/lib/python2.7/site-packages/git/cmd.py", line 576, in execute
raise GitCommandNotFound(str(err))
git.exc.GitCommandNotFound: [Errno 24] Too many open files
Hi. Thanks for this great script. Before I use it, though, I'm wondering how it handles Git submodules. Does it pull the latest version of each submodule repo, or does it honour the commit id in the submodule record? Fwiw, I would like to have the option to do either. But if the submodules are pulled from the remote repo the script should really update the submodule record with those new commit ids.
Also, what happens if I make changes to local repos? Will this script push changes from all of my projects as well? (This is something that I would want--one pull at the start of my session and one push at the end.)
Thanks again.
When bookmarks are no longer valid, I wish to clean up them with a simple command rather than delete them one by one.
According to the README, looks like Python 3 should be supported. Maybe Python 2 requirement can dropped.
I just started getting this error, it stops on the same repo each time, but if i cd into that repo and run gitup . it works fine
Fetching origin: up to date.
Updating master: Traceback (most recent call last):
File "/usr/local/bin/gitup", line 9, in <module>
load_entry_point('gitup==0.2.3', 'console_scripts', 'gitup')()
File "build/bdist.macosx-10.10-x86_64/egg/gitup/script.py", line 90, in run
File "build/bdist.macosx-10.10-x86_64/egg/gitup/script.py", line 82, in main
File "build/bdist.macosx-10.10-x86_64/egg/gitup/update.py", line 296, in update_directories
File "build/bdist.macosx-10.10-x86_64/egg/gitup/update.py", line 275, in _update_directory
File "build/bdist.macosx-10.10-x86_64/egg/gitup/update.py", line 256, in _update_subdirectories
File "build/bdist.macosx-10.10-x86_64/egg/gitup/update.py", line 240, in _update_repository
File "build/bdist.macosx-10.10-x86_64/egg/gitup/update.py", line 198, in _update_branches
File "build/bdist.macosx-10.10-x86_64/egg/gitup/update.py", line 178, in _update_branch
File "/usr/local/lib/python2.7/site-packages/GitPython-1.0.0-py2.7.egg/git/refs/symbolic.py", line 183, in _get_commit
obj = self._get_object()
File "/usr/local/lib/python2.7/site-packages/GitPython-1.0.0-py2.7.egg/git/refs/symbolic.py", line 176, in _get_object
return Object.new_from_sha(self.repo, hex_to_bin(self.dereference_recursive(self.repo, self.path)))
File "/usr/local/lib/python2.7/site-packages/GitPython-1.0.0-py2.7.egg/git/objects/base.py", line 65, in new_from_sha
oinfo = repo.odb.info(sha1)
File "/usr/local/lib/python2.7/site-packages/gitdb-0.6.4-py2.7-macosx-10.10-x86_64.egg/gitdb/db/base.py", line 205, in info
return self._db_query(sha).info(sha)
File "/usr/local/lib/python2.7/site-packages/gitdb-0.6.4-py2.7-macosx-10.10-x86_64.egg/gitdb/db/loose.py", line 157, in info
m = self._map_loose_object(sha)
File "/usr/local/lib/python2.7/site-packages/gitdb-0.6.4-py2.7-macosx-10.10-x86_64.egg/gitdb/db/loose.py", line 135, in _map_loose_object
return file_contents_ro_filepath(db_path, flags=self._fd_open_flags)
File "/usr/local/lib/python2.7/site-packages/gitdb-0.6.4-py2.7-macosx-10.10-x86_64.egg/gitdb/util.py", line 190, in file_contents_ro_filepath
return file_contents_ro(fd, stream, allow_mmap)
File "/usr/local/lib/python2.7/site-packages/gitdb-0.6.4-py2.7-macosx-10.10-x86_64.egg/gitdb/util.py", line 163, in file_contents_ro
return mmap.mmap(fd, os.fstat(fd).st_size, access=mmap.ACCESS_READ)
mmap.error: [Errno 24] Too many open files
ℹ️ current gitup dev@f7a060af
Fetching originTraceback (most recent call last):
File "/usr/local/bin/gitup", line 11, in <module>
load_entry_point('gitup==0.4.dev0', 'console_scripts', 'gitup')()
File "build/bdist.linux-x86_64/egg/gitup/script.py", line 137, in run
File "build/bdist.linux-x86_64/egg/gitup/script.py", line 129, in main
File "build/bdist.linux-x86_64/egg/gitup/update.py", line 254, in update_directories
File "build/bdist.linux-x86_64/egg/gitup/update.py", line 240, in _dispatch
File "build/bdist.linux-x86_64/egg/gitup/update.py", line 175, in _update_repository
File "build/bdist.linux-x86_64/egg/gitup/update.py", line 78, in _fetch_remotes
File "/usr/local/lib/python2.7/dist-packages/GitPython-2.0.8-py2.7.egg/git/remote.py", line 743, in fetch
res = self._get_fetch_info_from_stderr(proc, progress)
File "/usr/local/lib/python2.7/dist-packages/GitPython-2.0.8-py2.7.egg/git/remote.py", line 640, in _get_fetch_info_from_stderr
finalize_process(proc, stderr=stderr_text)
File "/usr/local/lib/python2.7/dist-packages/GitPython-2.0.8-py2.7.egg/git/util.py", line 155, in finalize_process
proc.wait(**kwargs)
File "/usr/local/lib/python2.7/dist-packages/GitPython-2.0.8-py2.7.egg/git/cmd.py", line 322, in wait
stderr = force_bytes(stderr)
File "/usr/lib/python2.7/dist-packages/gitdb/utils/encoding.py", line 16, in force_bytes
return data.encode(encoding)
UnicodeEncodeError: 'ascii' codec can't encode character u'\xfc' in position 224: ordinal not in range(128)
perhaps related / answered by http://stackoverflow.com/questions/5760936
I'm not that in with python ;/
also I can't see any branch with umlauts
but indeed, there are many branches in the affected repo using git-flow scheme like feature/TICKET-882_Some_Short_Description
, all of them or none matching with git branch -avv | grep "[^a-Z0-9\.\/_\-]"
Messages may indeed contain umlauts, but that should not be a problem anyway
Currently gitup sequentially pulls repo's one by one inside the passed in folder. What if there was a turbo mode which executes git pull on all the repo's concurrently? The tty print can be suppressed in that case and maybe a report generated (since there could be theoretically 100'ds of repo's being updated at the same time). Just a thought. Python is not my forte so can't create a PR with the suggested change :(.
I have a directory which contains all the projects I want to track. It's awesome I just need to issue a command gitup . to update all the repositories.
But most of the time, I want to have a look at which repository has commits recently, so I can look into what is changed.
how about provide a command like
gitup --recent 5 .
which will list repositories which have commits in 5 days.
Hi, does gitup support git push as well?
When it tries to update a repo which is currently on a detached HEAD:
Traceback (most recent call last):
File "/Users/km/python/bin/gitup", line 9, in <module>
load_entry_point('gitup==0.2.1', 'console_scripts', 'gitup')()
File "build/bdist.macosx-10.9-x86_64/egg/gitup/script.py", line 90, in run
File "build/bdist.macosx-10.9-x86_64/egg/gitup/script.py", line 85, in main
File "build/bdist.macosx-10.9-x86_64/egg/gitup/update.py", line 275, in update_bookmarks
File "build/bdist.macosx-10.9-x86_64/egg/gitup/update.py", line 262, in _update_directory
File "build/bdist.macosx-10.9-x86_64/egg/gitup/update.py", line 243, in _update_subdirectories
File "build/bdist.macosx-10.9-x86_64/egg/gitup/update.py", line 212, in _update_repository
File "/Users/km/python/lib/python2.7/site-packages/GitPython-0.3.2.RC1-py2.7.egg/git/repo/base.py", line 551, in active_branch
return self.head.reference
File "/Users/km/python/lib/python2.7/site-packages/GitPython-0.3.2.RC1-py2.7.egg/git/refs/symbolic.py", line 244, in _get_reference
raise TypeError("%s is a detached symbolic reference as it points to %r" % (self, sha))
TypeError: HEAD is a detached symbolic reference as it points to '4f739b507fb688b6e8b04c03d9d4a88863051e68'
I've got a pretty regular practice of updating my entire $GOPATH
of repos, of which there are quite a few. Whenever I run gitup
across this large of a list, it invariably ends in this error:
File "/usr/local/bin/gitup", line 9, in <module>
load_entry_point('gitup==0.3.1.dev0', 'console_scripts', 'gitup')()
File "build/bdist.macosx-10.10-x86_64/egg/gitup/script.py", line 111, in run
File "build/bdist.macosx-10.10-x86_64/egg/gitup/script.py", line 103, in main
File "build/bdist.macosx-10.10-x86_64/egg/gitup/update.py", line 227, in update_directories
File "build/bdist.macosx-10.10-x86_64/egg/gitup/update.py", line 208, in _update_directory
File "build/bdist.macosx-10.10-x86_64/egg/gitup/update.py", line 192, in _update_subdirectories
File "build/bdist.macosx-10.10-x86_64/egg/gitup/update.py", line 177, in _update_repository
File "build/bdist.macosx-10.10-x86_64/egg/gitup/update.py", line 116, in _update_branch
File "/usr/local/lib/python2.7/site-packages/git/cmd.py", line 440, in <lambda>
return lambda *args, **kwargs: self._call_process(name, *args, **kwargs)
File "/usr/local/lib/python2.7/site-packages/git/cmd.py", line 834, in _call_process
return self.execute(make_call(), **_kwargs)
File "/usr/local/lib/python2.7/site-packages/git/cmd.py", line 587, in execute
stdout_value, stderr_value = proc.communicate()
File "/usr/local/Cellar/python/2.7.10/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 799, in communicate
return self._communicate(input)
File "/usr/local/Cellar/python/2.7.10/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 1411, in _communicate
stdout, stderr = self._communicate_with_select(input)
File "/usr/local/Cellar/python/2.7.10/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 1512, in _communicate_with_select
rlist, wlist, xlist = select.select(read_set, write_set, [])
ValueError: filedescriptor out of range in select()
I'm not able to finish updating this directory, so I'm forced to break apart into smaller chunks.
Hello,
in case you did not know, your main use case for this script is already being taken care by git itself. You can setup a remote that really has several URLs:
# to set up a remote called "all" that will get updated with four URLs:
git remote add all URL1
git remote set-url all --add URL2
git remote set-url all --add URL3
git remote set-url all --add URL4
it's also a good idea to setup indepedently the remotes for each URL:
git remote add repo1 URL1
git remote add repo2 URL2
git remote add repo3 URL3
git remote add repo4 URL4
And then you can push to all the URLs by pushing to that remote
git push all master
Finally, you sure want to have all your refs up to date as well, so you can do:
git fetch --all
to keep all your refs in sync with the all remote.
hint: you can do the last two operations in one command, with the following alias:
git config alias.pushall "!pushall() { git push all $1 && git fetch --all ; }; pushall"
So I'm sure your tool does more than just that, but I thought I'd tell you about this, and I believe it'd be a good idea that you'd take advantage of that feature in your tool as well!
HTH
getting this error on some of the repos i try to update. :-(
vim-airline:
Fetching origin (Traceback (most recent call last):
File "/usr/local/bin/gitup", line 9, in
load_entry_point('gitup==0.2.2', 'console_scripts', 'gitup')()
File "build/bdist.linux-x86_64/egg/gitup/script.py", line 90, in run
File "build/bdist.linux-x86_64/egg/gitup/script.py", line 82, in main
File "build/bdist.linux-x86_64/egg/gitup/update.py", line 288, in update_directories
File "build/bdist.linux-x86_64/egg/gitup/update.py", line 267, in _update_directory
File "build/bdist.linux-x86_64/egg/gitup/update.py", line 248, in _update_subdirectories
File "build/bdist.linux-x86_64/egg/gitup/update.py", line 231, in _update_repository
File "build/bdist.linux-x86_64/egg/gitup/update.py", line 90, in _fetch_remotes
File "/usr/local/lib/python2.7/dist-packages/GitPython-0.3.6-py2.7.egg/git/remote.py", line 626, in fetch
res = self._get_fetch_info_from_stderr(proc, progress or RemoteProgress())
File "/usr/local/lib/python2.7/dist-packages/GitPython-0.3.6-py2.7.egg/git/remote.py", line 541, in _get_fetch_info_from_stderr
for pline in progress_handler(line):
File "/usr/local/lib/python2.7/dist-packages/GitPython-0.3.6-py2.7.egg/git/util.py", line 285, in handler
return self._parse_progress_line(line.rstrip())
File "/usr/local/lib/python2.7/dist-packages/GitPython-0.3.6-py2.7.egg/git/util.py", line 275, in _parse_progress_line
message)
File "build/bdist.linux-x86_64/egg/gitup/update.py", line 44, in update
TypeError: object of type 'float' has no len()
I am having difficulty getting gitup to update all 74 repos in a directory. The first repos update properly; then at some point during the run, I receive the error message below. If I cd
into the first repo that fails, I can individually git pull
without a problem. The issue does not always fail at the same repo, but once the error occurs then all subsequent repos fail for that run.
All of these repos were updating properly on an older computer. This issue occurred when I started using a new computer to update the repos. It is an M1 Mac mini, running gitup 0.5.1 (Python 3.10.0)
installed via homebrew and git version 2.30.1 (Apple Git-130)
. I am using SSH for authentication, and I individually cloned each repo onto the new computer (from GitHub).
(Repo names changed to numbers...)
repo12:
Fetching origin: up to date.
Updating master: up to date.
repo13:
Fetching origin: up to date.
Updating master: up to date.
repo14:
Fetching origin: up to date.
Updating master: up to date.
repo15:
Fetching origin: up to date.
Updating master: up to date.
repo16:
Fetching origin: up to date.
Updating master: up to date.
repo17:
Fetching origin: up to date.
Updating master: up to date.
repo18:
Fetching origin: error: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists.
Updating master: up to date.
repo19:
Fetching origin: error: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists.
Updating master: up to date.
repo20:
Fetching origin: error: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists.
Updating main: up to date.
repo21:
Fetching origin: error: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists.
Updating main: up to date.
repo22:
Fetching origin: error: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists.
Updating master: up to date.
repo23:
Fetching origin: error: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists.
Updating main: up to date.
repo24:
Fetching origin: error: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists.
Updating main: up to date.
For troubleshooting, I tried changing the SSH key (locally and pasting it at GitHub). Also, I have individually pulled from each repo to make sure that each one works. In some cases, I received the following error:
kex_exchange_identification: read: Connection reset by peer
fatal: Could not read from remote repository.
I was able to get around the error by cd
into the repo, doing a git fetch
, then a git pull
, and the error was no longer present. But it is odd...
Thanks for any advice here!
So, I added some repos, by the way, I found that bookmarks are not recursive, so I used a /*, that seemly, worked, it added all subfolders (on one level at least), so, after adding like 10 repos I run:
gitup
This is what I got (and every time I run it)
Hello,
First off, I really enjoy using the tool. Quite a time saver! Can you add a feature for a recursive git status command to check that I don't have any outstanding changes that need to be pushed up?
Thanks,
Mike
Hello,
I am installing gitup at Debian 7 stable and found this error
za@github:~/$ gitup planpin
gitup: the git-repo-updater
Directory "/home/za/github/planpin" is a git repository:
planpin:
Fetching originTraceback (most recent call last):
File "/usr/local/bin/gitup", line 9, in <module>
load_entry_point('gitup==0.2.2', 'console_scripts', 'gitup')()
File "build/bdist.linux-i686/egg/gitup/script.py", line 90, in run
File "build/bdist.linux-i686/egg/gitup/script.py", line 82, in main
File "build/bdist.linux-i686/egg/gitup/update.py", line 288, in update_directories
File "build/bdist.linux-i686/egg/gitup/update.py", line 274, in _update_directory
File "build/bdist.linux-i686/egg/gitup/update.py", line 231, in _update_repository
File "build/bdist.linux-i686/egg/gitup/update.py", line 90, in _fetch_remotes
File "/usr/local/lib/python2.7/dist-packages/GitPython-0.3.2.RC1-py2.7.egg/git/remote.py", line 591, in fetch
kwargs = add_progress(kwargs, self.repo.git, progress)
File "/usr/local/lib/python2.7/dist-packages/GitPython-0.3.2.RC1-py2.7.egg/git/remote.py", line 79, in add_progress
v = git.version_info
File "/usr/local/lib/python2.7/dist-packages/GitPython-0.3.2.RC1-py2.7.egg/git/cmd.py", line 250, in version_info
return self._version_info
File "/usr/local/lib/python2.7/dist-packages/GitPython-0.3.2.RC1-py2.7.egg/git/cmd.py", line 226, in __getattr__
return LazyMixin.__getattr__(self, name)
File "/usr/local/lib/python2.7/dist-packages/gitdb-0.5.4-py2.7-linux-i686.egg/gitdb/util.py", line 238, in __getattr__
self._set_cache_(attr)
File "/usr/local/lib/python2.7/dist-packages/GitPython-0.3.2.RC1-py2.7.egg/git/cmd.py", line 233, in _set_cache_
self._version_info = tuple(int(n) for n in version_numbers.split('.')[:4])
File "/usr/local/lib/python2.7/dist-packages/GitPython-0.3.2.RC1-py2.7.egg/git/cmd.py", line 233, in <genexpr>
self._version_info = tuple(int(n) for n in version_numbers.split('.')[:4])
ValueError: invalid literal for int() with base 10: 'rc0'
Would it be possible to upload this project as gitup
or git-repo-updater
to PyPI so that we could simply install (and update) via pip
?
Homebrew already provides a convenient update mechanism for macOS users, but it would be more general if it was available via PyPI.
PS: Thanks for this very useful script!
Hi,
This tool is great!
I'm currently using ghq
to manage remote repositories. One of the repositories I have connects to Gitlab over HTTPs on a non-standard port (i.e., 4545) and thus I have a repository location of /Users/me/dev/src/path.to.server:4545/project/repo
.
When adding this repository to gitup
, I can verify that .config/gitup/config.ini
has the line:
/Users/me/dev/src/path.to.server:4545/project/repo = repo
When Gitup attempts to update this repository, I get:
Error: /Users/me/dev/src/path.to.server doesn't exist!
Apparently the default delimiters that configparser
use are both =
and :
, but can be changed. Can we look into configuring configparser
to not use colons as a delimiter?
Thanks!
First thanks for this script.
I have to take one more step to make it work on command prompt in any folder on windows. Hope you would put it into the Readme.
Add a macro so that you can invoke gitup from any directory: (Note that C:\python27\ refers to the directory where python 2.7 is installed)
DOSKEY gitup=c:\python27\python.exe c:\python27\Scripts\gitup $*
Hello I am getting the following error when I am updating after a while.
It seems to happen after a certain amount of repo's.
Traceback (most recent call last):
File "/usr/bin/gitup", line 9, in <module>
load_entry_point('gitup==0.4.dev0', 'console_scripts', 'gitup')()
File "build/bdist.linux-x86_64/egg/gitup/script.py", line 137, in run
File "build/bdist.linux-x86_64/egg/gitup/script.py", line 129, in main
File "build/bdist.linux-x86_64/egg/gitup/update.py", line 245, in update_direc tories
File "build/bdist.linux-x86_64/egg/gitup/update.py", line 226, in _dispatch
File "build/bdist.linux-x86_64/egg/gitup/update.py", line 208, in _dispatch_to _subdirs
File "build/bdist.linux-x86_64/egg/gitup/update.py", line 178, in _update_repo sitory
File "build/bdist.linux-x86_64/egg/gitup/update.py", line 107, in _update_bran ch
File "/usr/lib/python2.7/site-packages/GitPython-2.0.6-py2.7.egg/git/refs/symb olic.py", line 183, in _get_commit
obj = self._get_object()
File "/usr/lib/python2.7/site-packages/GitPython-2.0.6-py2.7.egg/git/refs/symb olic.py", line 176, in _get_object
return Object.new_from_sha(self.repo, hex_to_bin(self.dereference_recursive( self.repo, self.path)))
File "/usr/lib/python2.7/site-packages/GitPython-2.0.6-py2.7.egg/git/objects/b ase.py", line 65, in new_from_sha
oinfo = repo.odb.info(sha1)
File "/usr/lib/python2.7/site-packages/GitPython-2.0.6-py2.7.egg/git/db.py", l ine 40, in info
hexsha, typename, size = self._git.get_object_header(bin_to_hex(sha))
File "/usr/lib/python2.7/site-packages/GitPython-2.0.6-py2.7.egg/git/cmd.py", line 992, in get_object_header
cmd = self._get_persistent_cmd("cat_file_header", "cat_file", batch_check=Tr ue)
File "/usr/lib/python2.7/site-packages/GitPython-2.0.6-py2.7.egg/git/cmd.py", line 975, in _get_persistent_cmd
cmd = self._call_process(cmd_name, *args, **options)
File "/usr/lib/python2.7/site-packages/GitPython-2.0.6-py2.7.egg/git/cmd.py", line 929, in _call_process
return self.execute(make_call(), **_kwargs)
File "/usr/lib/python2.7/site-packages/GitPython-2.0.6-py2.7.egg/git/cmd.py", line 625, in execute
raise GitCommandNotFound(str(err))
git.exc.GitCommandNotFound: [Errno 24] Too many open files
I have several hundred repos in my gitup bookmarks, and many of them don't have updates when I run gitup
. It would be nice if there were a way to have gitup
stifle output for repos that didn't have any updates.
Hey!
I wrote my own little custom updater some time ago but came across this project recently and strongly preferred it because it is used by more than 1 person and is open source, etc. Thanks for writing this tool!
I run this in a cron job, and its output is sent as mail to my user every time it runs. I'd love it if there were a "silent" mode such that only failed actions would be output. If the update was performed successfully, there would be no output.
What do you think?
ℹ️ current gitup dev@f7a060af
The repo:
== BRANCHES ==
* master 7f6c811 [origin/master] some changes
master2 b72feb7 [origin/master: 160 ahead, 100 behins] some playground changes
the error:
/home/marcel/Projects/repo (1 repo):
repoName:
Fetching origin (66/66): branch update (master).
Updating master: done.
Updating master2: Traceback (most recent call last):
File "/usr/local/bin/gitup", line 11, in <module>
load_entry_point('gitup==0.4.dev0', 'console_scripts', 'gitup')()
File "build/bdist.linux-x86_64/egg/gitup/script.py", line 137, in run
File "build/bdist.linux-x86_64/egg/gitup/script.py", line 129, in main
File "build/bdist.linux-x86_64/egg/gitup/update.py", line 254, in update_directories
File "build/bdist.linux-x86_64/egg/gitup/update.py", line 240, in _dispatch
File "build/bdist.linux-x86_64/egg/gitup/update.py", line 179, in _update_repository
File "build/bdist.linux-x86_64/egg/gitup/update.py", line 118, in _update_branch
File "/usr/local/lib/python2.7/dist-packages/GitPython-2.0.8-py2.7.egg/git/cmd.py", line 466, in <lambda>
return lambda *args, **kwargs: self._call_process(name, *args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/GitPython-2.0.8-py2.7.egg/git/cmd.py", line 934, in _call_process
return self.execute(make_call(), **_kwargs)
File "/usr/local/lib/python2.7/dist-packages/GitPython-2.0.8-py2.7.egg/git/cmd.py", line 718, in execute
raise GitCommandError(command, status, stderr_value)
git.exc.GitCommandError: 'git merge-base b72feb7eefef00573061934097cd64266ad60a40 7f6c811d0f7b5896f2f49035a8190176a6cbeb01' returned with exit code 1
Should I run gitup/test/__init__.py
or some other test are available?
Currently, I can't simply put ~/Github/*
in my "bookmarks" file. Since I can pass that as an argument to gitup
, it seems reasonable it should be supported there too. I fully understand that the shell actually expands those globs, rather than the gitup
command, but even still I think it would be useful.
If you have any blank lines in your bookmarks file, you get the following error:
Error: isn't a repository!
It would be nice if gitup
ignored empty lines.
hello, is there a way that we can pull updates from other remote like, dev or beta branch? currently, it will only pull from master branch.
Hello @earwig
I am getting this error after installing to a new workstation.
File "/home/dogstring/.local/bin/gitup", line 11, in <module>
load_entry_point('gitup==0.5.1', 'console_scripts', 'gitup')()
File "/home/dogstring/.local/lib/python2.7/site-packages/pkg_resources/__init__.py", line 489, in load_entry_point
return get_distribution(dist).load_entry_point(group, name)
File "/home/dogstring/.local/lib/python2.7/site-packages/pkg_resources/__init__.py", line 2852, in load_entry_point
return ep.load()
File "/home/dogstring/.local/lib/python2.7/site-packages/pkg_resources/__init__.py", line 2443, in load
return self.resolve()
File "/home/dogstring/.local/lib/python2.7/site-packages/pkg_resources/__init__.py", line 2449, in resolve
module = __import__(self.module_name, fromlist=['__name__'], level=0)
File "build/bdist.linux-x86_64/egg/gitup/cli.py", line 18, in <module>
File "build/bdist.linux-x86_64/egg/gitup/update.py", line 15, in <module>
File "/home/dogstring/.local/lib/python2.7/site-packages/GitPython-3.1.0-py2.7.egg/git/__init__.py", line 40, in <module>
from git.config import GitConfigParser # @NoMove @IgnorePep8
File "/home/dogstring/.local/lib/python2.7/site-packages/GitPython-3.1.0-py2.7.egg/git/config.py", line 28, in <module>
import configparser as cp
ImportError: No module named configparser
I did follow the instruction though
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.