Merge pull request #1441 from jberry-suse/osclib-git

osclib/git: provide git utilities: clone() and sync() and utilize in issue-diff.py.
This commit is contained in:
Jimmy Berry 2018-03-09 11:58:57 -06:00 committed by GitHub
commit d001daf687
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 55 additions and 40 deletions

View File

@ -22,6 +22,8 @@ import osc.core
from osclib.cache import Cache
from osclib.core import package_list
from osclib.git import CACHE_DIR
from osclib.git import sync
# Issue summary can contain unicode characters and therefore a string containing
# either summary or one in which ISSUE_SUMMARY is then placed must be unicode.
@ -205,40 +207,6 @@ def issues_get(apiurl, project, package, trackers, db):
return issues
def git_clone(url, directory):
return_code = subprocess.call(['git', 'clone', url, directory])
if return_code != 0:
raise Exception('Failed to clone {}'.format(url))
def sync(config_dir, db_dir):
cwd = os.getcwd()
devnull = open(os.devnull, 'wb')
git_sync_dir = os.path.join(config_dir, 'git-sync')
git_sync_exec = os.path.join(git_sync_dir, 'git-sync')
if not os.path.exists(git_sync_dir):
os.makedirs(git_sync_dir)
git_clone('https://github.com/simonthum/git-sync.git', git_sync_dir)
else:
os.chdir(git_sync_dir)
subprocess.call(['git', 'pull', 'origin', 'master'], stdout=devnull, stderr=devnull)
if not os.path.exists(db_dir):
os.makedirs(db_dir)
git_clone('git@github.com:jberry-suse/osc-plugin-factory-issue-db.git', db_dir)
os.chdir(db_dir)
subprocess.call(['git', 'config', '--bool', 'branch.master.sync', 'true'])
subprocess.call(['git', 'config', '--bool', 'branch.master.syncNewFiles', 'true'])
subprocess.call(['git', 'config', 'branch.master.syncCommitMsg', 'Sync issue-diff.py changes.'])
os.chdir(db_dir)
return_code = subprocess.call([git_sync_exec])
if return_code != 0:
raise Exception('Failed to sync local db changes.')
os.chdir(cwd)
def print_stats(db):
bug_ids = []
reported = 0
@ -273,9 +241,10 @@ def main(args):
Cache.init()
db_dir = os.path.join(args.config_dir, 'issue-db')
git_repo_url = 'git@github.com:jberry-suse/osc-plugin-factory-issue-db.git'
git_message = 'Sync issue-diff.py changes.'
db_dir = sync(args.cache_dir, git_repo_url, git_message)
db_file = os.path.join(db_dir, '{}.yml'.format(args.project))
sync(args.config_dir, db_dir)
if os.path.exists(db_file):
db = yaml.safe_load(open(db_file).read())
@ -424,7 +393,7 @@ def main(args):
print('stopped at limit')
break
sync(args.config_dir, db_dir)
sync(args.cache_dir, git_repo_url, git_message)
if __name__ == '__main__':
@ -443,11 +412,11 @@ if __name__ == '__main__':
parser.add_argument('-p', '--project', default='SUSE:SLE-12-SP3:GA', metavar='PROJECT', help='project to check for issues that have are not found in factory')
parser.add_argument('--newest', type=int, default='30', metavar='AGE_IN_DAYS', help='newest issues to be considered')
parser.add_argument('--limit', type=int, default='0', help='limit number of packages with new issues processed')
parser.add_argument('--config-dir', help='configuration directory containing git-sync tool and issue db')
parser.add_argument('--cache-dir', help='cache directory containing git-sync tool and issue db')
parser.add_argument('--print-stats', action='store_true', help='print statistics based on database')
args = parser.parse_args()
if args.config_dir is None:
args.config_dir = os.path.expanduser('~/.osc-plugin-factory')
if args.cache_dir is None:
args.cache_dir = CACHE_DIR
sys.exit(main(args))

46
osclib/git.py Normal file
View File

@ -0,0 +1,46 @@
import os
from os import path
import subprocess
from xdg.BaseDirectory import save_cache_path
CACHE_DIR = save_cache_path('osc-plugin-factory', 'git')
def clone(url, directory):
return_code = subprocess.call(['git', 'clone', url, directory])
if return_code != 0:
raise Exception('Failed to clone {}'.format(url))
def sync(cache_dir, repo_url, message=None):
cwd = os.getcwd()
devnull = open(os.devnull, 'wb')
# Ensure git-sync tool is available.
git_sync_dir = path.join(cache_dir, 'git-sync')
git_sync_exec = path.join(git_sync_dir, 'git-sync')
if not path.exists(git_sync_dir):
os.makedirs(git_sync_dir)
clone('https://github.com/simonthum/git-sync.git', git_sync_dir)
else:
os.chdir(git_sync_dir)
subprocess.call(['git', 'pull', 'origin', 'master'], stdout=devnull, stderr=devnull)
repo_name = path.basename(path.normpath(repo_url))
repo_dir = path.join(cache_dir, repo_name)
if not path.exists(repo_dir):
os.makedirs(repo_dir)
clone(repo_url, repo_dir)
os.chdir(repo_dir)
subprocess.call(['git', 'config', '--bool', 'branch.master.sync', 'true'])
subprocess.call(['git', 'config', '--bool', 'branch.master.syncNewFiles', 'true'])
if message:
subprocess.call(['git', 'config', 'branch.master.syncCommitMsg', message])
os.chdir(repo_dir)
return_code = subprocess.call([git_sync_exec])
if return_code != 0:
raise Exception('failed to sync {}'.format(repo_name))
os.chdir(cwd)
return repo_dir