123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145 |
- # -*- coding: utf-8 -*-
- """
- walle-web
- :copyright: © 2015-2019 walle-web.io
- :created time: 2019-02-24 10:47:53
- :author: wushuiyong@walle-web.io
- """
- import os
- import re
- import os.path as osp
- import git as PyGit
- from git import Repo as PyRepo
- class Repo:
- path = None
- def __init__(self, path=None):
- self.path = path
- def is_git_dir(self):
- '''
- 判断是否为git目录
- @param path:
- @return:
- '''
- d = self.path + '/.git'
- if osp.isdir(d):
- if osp.isdir(osp.join(d, 'objects')) and osp.isdir(osp.join(d, 'refs')):
- headref = osp.join(d, 'HEAD')
- return osp.isfile(headref) or \
- (osp.islink(headref) and
- os.readlink(headref).startswith('refs'))
- elif (osp.isfile(osp.join(d, 'gitdir')) and
- osp.isfile(osp.join(d, 'commondir')) and
- osp.isfile(osp.join(d, 'gitfile'))):
- return False
- return False
- def init(self, url):
- # 创建目录
- if not os.path.exists(self.path):
- os.makedirs(self.path)
- # git clone
- if self.is_git_dir():
- return self.pull()
- else:
- return self.clone(url)
- def clone(self, url):
- '''
- 检出项目
- @param branch:
- @param kwargs:
- @return:
- '''
- return PyRepo.clone_from(url, self.path)
- def pull(self):
- '''
- 更新项目
- @param branch:
- @param kwargs:
- @return:
- '''
- repo = PyRepo(self.path)
- return repo.remote().pull()
- def checkout_2_branch(self, branch):
- PyRepo(self.path).git.checkout(branch)
- def checkout_2_commit(self, branch, commit):
- '''
- @todo 未完成
- @param branch:
- @param commit:
- @return:
- '''
- PyRepo(self.path).git.checkout(branch)
- # PyRepo(self.path).head.set_reference(branch)
- # 方法有问题,只是做了reset,没有checkout
- PyRepo(self.path).head.set_commit(commit)
- def checkout_2_tag(self, tag):
- PyRepo(self.path).git.checkout(tag)
- def branches(self):
- '''
- 获取所有分支
- @param branch:
- @param kwargs:
- @return:
- '''
- # 去除 origin/HEAD -> 当前指向
- # 去除远端前缀
- branches = PyRepo(self.path).remote().refs
- # fixbug https://github.com/meolu/walle-web/issues/705
- return [str(branch).strip().lstrip('origin').lstrip('/') for branch in branches if
- not str(branch).strip().startswith('origin/HEAD')]
- def tags(self):
- '''
- 获取所有tag
- @param branch:
- @param kwargs:
- @return:
- '''
- return [str(tag) for tag in PyRepo(self.path).tags]
- def commits(self, branch):
- '''
- 获取分支的commits
- @param branch:
- @param kwargs:
- @return:
- '''
- self.checkout_2_branch(branch)
- commit_log = PyGit.Git(self.path).log('--pretty=%h #@_@# %an #@_@# %s', max_count=50)
- commit_list = commit_log.split('\n')
- commits = []
- for commit in commit_list:
- if not re.search('^.+ #@_@# .+ #@_@# .*$', commit):
- continue
- commit_dict = commit.split(' #@_@# ')
- from flask import current_app
- current_app.logger.info(commit_dict)
- commits.append({
- 'id': commit_dict[0],
- 'name': commit_dict[1],
- 'message': commit_dict[2],
- })
- return commits
|