mirror of https://github.com/openspug/spug
A api update
parent
883a351e1c
commit
908054b424
|
@ -4,4 +4,5 @@ from .views import *
|
|||
|
||||
urlpatterns = [
|
||||
path('', AppView.as_view()),
|
||||
path('<int:a_id>/versions/', get_versions),
|
||||
]
|
||||
|
|
|
@ -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()
|
|
@ -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})
|
||||
|
|
|
@ -21,6 +21,3 @@ class RequestView(View):
|
|||
form.host_ids = json.dumps(form.host_ids)
|
||||
DeployRequest.objects.create(**form)
|
||||
return json_response(error=error)
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -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
|
|
@ -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/
|
||||
|
|
Loading…
Reference in New Issue