Skip to content

Instantly share code, notes, and snippets.

@RoyXiang
Created November 4, 2012 10:58
Show Gist options
  • Save RoyXiang/4011338 to your computer and use it in GitHub Desktop.
Save RoyXiang/4011338 to your computer and use it in GitHub Desktop.
python script to update forked repository or submodules
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import re
import subprocess
def updateGit():
cwd = os.getcwd()
git = os.path.abspath(os.path.join(cwd, '.git'))
myURLs = r'https://github.com/RoyXiang/', r'[email protected]:RoyXiang/'
if os.path.exists(git):
if os.path.isdir(git):
config = os.path.join(git, 'config')
else:
gitfile = open(git, 'r')
for line in gitfile:
gitdir = re.match(r'^gitdir\:\s*(.*)$', line)
if gitdir != None:
config = os.path.join(cwd, line[gitdir.start(1):gitdir.end(1)], 'config')
break
config = os.path.abspath(config)
else:
print 'This is not a git foler!'
return
lines = open(config, 'r').readlines()
for i in range(len(lines)):
part = re.match(r'^\[([\w]+)(?:\s"([^\]]+)")?\]$', lines[i])
if part != None:
i = i + 1
if part.group(1) == 'remote':
while True:
url = re.match(r'^\s*url\s*=\s*([^\s]+)$', lines[i])
if url != None:
if not (lines[i][url.start(1):url.end(1)]).startswith(myURLs):
if part.group(2) == 'origin':
subprocess.call(['git', 'pull'])
else:
subprocess.call(['git', 'fetch', part.group(2)])
subprocess.call(['git', 'merge', part.group(2) + '/master'])
break
else:
i = i + 1
elif part.group(1) == 'submodule':
url = re.match(r'^\s*url\s*=\s*([^\s]+)$', lines[i])
print 'Entering \"' + part.group(2) + '\"'
path = os.path.abspath(os.path.join(cwd, part.group(2)))
os.chdir(path)
updateGit()
os.chdir(cwd)
if __name__ == '__main__':
updateGit()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment