A api update

pull/22/head
雷二猛 2019-12-16 00:51:41 +08:00
parent 883a351e1c
commit 908054b424
6 changed files with 84 additions and 12 deletions

View File

@ -4,4 +4,5 @@ from .views import *
urlpatterns = [
path('', AppView.as_view()),
path('<int:a_id>/versions/', get_versions),
]

View File

@ -0,0 +1,21 @@
from django.conf import settings
from apps.app.models import App
from libs.gitlib import Git
import os
def parse_envs(text):
data = {}
if data:
for line in text.split('\n'):
fields = line.split('=', 1)
if len(fields) != 2 or fields[0].strip() == '':
raise Exception(f'解析自定义全局变量{line!r}失败,确认其遵循 key = value 格式')
data[fields[0].strip()] = fields[1].strip()
return data
def fetch_versions(app: App):
git_repo = app.extend_obj.git_repo
repo_dir = os.path.join(settings.REPOS_DIR, str(app.id))
return Git(git_repo, repo_dir).fetch_branches_tags()

View File

@ -1,6 +1,7 @@
from django.views.generic import View
from libs import JsonParser, Argument, json_response
from apps.app.models import App, AppExtend1, AppExtend2
from apps.app.utils import parse_envs, fetch_versions
import json
@ -60,12 +61,11 @@ class AppView(View):
return json_response(error=error)
def parse_envs(data):
tmp = {}
if data:
for line in data.split('\n'):
fields = line.split('=', 1)
if len(fields) != 2 or fields[0].strip() == '':
raise Exception(f'解析自定义全局变量{line!r}失败,确认其遵循 key = value 格式')
tmp[fields[0].strip()] = fields[1].strip()
return tmp
def get_versions(request, a_id):
app = App.objects.filter(pk=a_id).first()
if not app:
return json_response(error='未找到指定应用')
if app.extend == '2':
return json_response(error='该应用不支持此操作')
branches, tags = fetch_versions(app)
return json_response({'branches': branches, 'tags': tags})

View File

@ -21,6 +21,3 @@ class RequestView(View):
form.host_ids = json.dumps(form.host_ids)
DeployRequest.objects.create(**form)
return json_response(error=error)

52
spug_api/libs/gitlib.py Normal file
View File

@ -0,0 +1,52 @@
from git import Repo, RemoteReference, TagReference, InvalidGitRepositoryError
import shutil
import os
class Git:
def __init__(self, git_repo, repo_dir):
self.repo = self._get_repo(git_repo, repo_dir)
def archive(self, filepath, commit):
with open(filepath, 'wb') as f:
self.repo.archive(f, commit)
def fetch_branches_tags(self):
self.repo.remotes.origin.fetch()
branches, tags = {}, {}
for ref in self.repo.references:
if isinstance(ref, RemoteReference):
if ref.remote_head != 'HEAD':
branches[ref.remote_head] = self._get_commits(f'origin/{ref.remote_head}')
elif isinstance(ref, TagReference):
tags[ref.name] = {
'id': ref.tag.hexsha,
'author': ref.tag.tagger.name,
'date': ref.tag.tagged_date,
'message': ref.tag.message.strip()
}
return branches, tags
def _get_repo(self, git_repo, repo_dir):
if os.path.exists(repo_dir):
try:
return Repo(repo_dir)
except InvalidGitRepositoryError:
if os.path.isdir(repo_dir):
shutil.rmtree(repo_dir)
else:
os.remove(repo_dir)
return Repo.clone_from(git_repo, repo_dir)
def _get_commits(self, branch, count=10):
commits = []
for commit in self.repo.iter_commits(branch):
if len(commits) == count:
break
commits.append({
'id': commit.hexsha,
'author': commit.author.name,
'date': commit.committed_date,
'message': commit.message.strip()
})
return commits

View File

@ -93,6 +93,7 @@ TEMPLATES = [
SCHEDULE_KEY = 'spug:schedule'
MONITOR_KEY = 'spug:monitor'
REPOS_DIR = os.path.join(BASE_DIR, 'repos')
# Internationalization
# https://docs.djangoproject.com/en/2.2/topics/i18n/