*** WIP ***
Beginning of Git integration - added gitpython to Pipfile - started additions for api, model, service, and a test
This commit is contained in:
parent
97c29bf77c
commit
c9b7d95a83
1
Pipfile
1
Pipfile
|
@ -43,6 +43,7 @@ werkzeug = "*"
|
||||||
xlrd = "*"
|
xlrd = "*"
|
||||||
xlsxwriter = "*"
|
xlsxwriter = "*"
|
||||||
pygithub = "*"
|
pygithub = "*"
|
||||||
|
gitpython = "*"
|
||||||
apscheduler = "*"
|
apscheduler = "*"
|
||||||
connexion = {extras = [ "swagger-ui",], version = "*"}
|
connexion = {extras = [ "swagger-ui",], version = "*"}
|
||||||
sentry-sdk = {extras = [ "flask",], version = "==0.14.4"}
|
sentry-sdk = {extras = [ "flask",], version = "==0.14.4"}
|
||||||
|
|
|
@ -78,6 +78,13 @@ GITHUB_TOKEN = environ.get('GITHUB_TOKEN', None)
|
||||||
GITHUB_REPO = environ.get('GITHUB_REPO', None)
|
GITHUB_REPO = environ.get('GITHUB_REPO', None)
|
||||||
TARGET_BRANCH = environ.get('TARGET_BRANCH', None)
|
TARGET_BRANCH = environ.get('TARGET_BRANCH', None)
|
||||||
|
|
||||||
|
# Git settings, used by git_service
|
||||||
|
# The above Github settings--used in file_service, will likely be deprecated
|
||||||
|
# You can override these settings in instance/config
|
||||||
|
GIT_REMOTE = environ.get('GIT_REMOTE', None)
|
||||||
|
GIT_BRANCH = environ.get('GIT_BRANCH', None)
|
||||||
|
GIT_MERGE_BRANCH = environ.get('GIT_MERGE_BRANCH', None) # Developers can set this to 'all' in instance.config
|
||||||
|
|
||||||
# Email configuration
|
# Email configuration
|
||||||
DEFAULT_SENDER = 'uvacrconnect@virginia.edu'
|
DEFAULT_SENDER = 'uvacrconnect@virginia.edu'
|
||||||
FALLBACK_EMAILS = ['askresearch@virginia.edu', 'sartographysupport@googlegroups.com']
|
FALLBACK_EMAILS = ['askresearch@virginia.edu', 'sartographysupport@googlegroups.com']
|
||||||
|
|
25
crc/api.yml
25
crc/api.yml
|
@ -1842,6 +1842,20 @@ paths:
|
||||||
schema:
|
schema:
|
||||||
$ref: "#/components/schemas/DataStore"
|
$ref: "#/components/schemas/DataStore"
|
||||||
|
|
||||||
|
/git_repo:
|
||||||
|
get:
|
||||||
|
operationId: crc.api.git_repo.get_repo
|
||||||
|
summary: get current state of the git repo
|
||||||
|
tags:
|
||||||
|
- Git Repo
|
||||||
|
responses:
|
||||||
|
'200':
|
||||||
|
description: Current state of the git repo
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: "#/components/schemas/GitRepo"
|
||||||
|
|
||||||
components:
|
components:
|
||||||
securitySchemes:
|
securitySchemes:
|
||||||
jwt:
|
jwt:
|
||||||
|
@ -2527,3 +2541,14 @@ components:
|
||||||
type: number
|
type: number
|
||||||
format: integer
|
format: integer
|
||||||
example: 5
|
example: 5
|
||||||
|
GitRepo:
|
||||||
|
properties:
|
||||||
|
remote:
|
||||||
|
type: string
|
||||||
|
example: sartography/crconnect-workflow-specs
|
||||||
|
directory:
|
||||||
|
type: string
|
||||||
|
example: /home/cr-connect/sync_files
|
||||||
|
branch:
|
||||||
|
type: string
|
||||||
|
example: dev
|
||||||
|
|
|
@ -0,0 +1,10 @@
|
||||||
|
def get_repo():
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def set_repo_branch():
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def commit_repo_changes():
|
||||||
|
pass
|
|
@ -0,0 +1,34 @@
|
||||||
|
from crc import app, ma
|
||||||
|
|
||||||
|
|
||||||
|
class GitRepo(object):
|
||||||
|
# @classmethod
|
||||||
|
# def from_models(cls, model: FileModel, data_model, doc_dictionary):
|
||||||
|
# instance = cls()
|
||||||
|
# instance.id = model.id
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def from_repo(cls, repo):
|
||||||
|
instance = cls()
|
||||||
|
instance.directory = repo.working_dir
|
||||||
|
instance.branch = repo.active_branch
|
||||||
|
instance.merge_branch = app.config['GIT_MERGE_BRANCH']
|
||||||
|
# instance.user =
|
||||||
|
# instance.changes = [item.a_path for item in repo.index.diff(None)]
|
||||||
|
# instance.untracked =
|
||||||
|
|
||||||
|
|
||||||
|
class GitCommit(object):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class GitRepoSchema(ma.Schema):
|
||||||
|
class Meta:
|
||||||
|
model = GitRepo
|
||||||
|
fields = ["directory", "branch"]
|
||||||
|
|
||||||
|
|
||||||
|
class GitCommitSchema(ma.Schema):
|
||||||
|
class Meta:
|
||||||
|
model = GitCommit
|
||||||
|
fields = ["message", "files"]
|
|
@ -0,0 +1,68 @@
|
||||||
|
from crc import app
|
||||||
|
from git import Repo, InvalidGitRepositoryError, NoSuchPathError
|
||||||
|
|
||||||
|
|
||||||
|
class GitService(object):
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_repo(directory):
|
||||||
|
repo = None
|
||||||
|
try:
|
||||||
|
repo = Repo(directory)
|
||||||
|
except InvalidGitRepositoryError as ge:
|
||||||
|
# Thrown if the given repository appears to have an invalid format.
|
||||||
|
# TODO: I believe this means there is no .git directory
|
||||||
|
# So, git init?
|
||||||
|
print(ge)
|
||||||
|
except NoSuchPathError as pe:
|
||||||
|
# TODO: clone from remote?
|
||||||
|
print(pe)
|
||||||
|
except Exception as e:
|
||||||
|
print(e)
|
||||||
|
return repo
|
||||||
|
|
||||||
|
def push_to_remote(self, comment):
|
||||||
|
directory = app.config['SYNC_FILE_ROOT']
|
||||||
|
repo = self.get_repo(directory)
|
||||||
|
# get list of changed files
|
||||||
|
changes = [item.a_path for item in repo.index.diff(None)]
|
||||||
|
# get list of untracked files
|
||||||
|
untracked_files = repo.untracked_files
|
||||||
|
branches = self.get_branches(repo)
|
||||||
|
for branch in branches:
|
||||||
|
if branch != repo.active_branch:
|
||||||
|
print(f'Branch: {branch}')
|
||||||
|
diff = repo.git.diff(branch.name)
|
||||||
|
print('##########')
|
||||||
|
print('##########')
|
||||||
|
print('##########')
|
||||||
|
print(diff)
|
||||||
|
continue
|
||||||
|
|
||||||
|
repo.index.add(changes)
|
||||||
|
repo.index.add(untracked_files)
|
||||||
|
# repo.index.commit(comment)
|
||||||
|
# repo.remotes.origin.push()
|
||||||
|
|
||||||
|
print(repo)
|
||||||
|
return repo
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def pull_from_remote(repo, branch):
|
||||||
|
repo.git.checkout(branch)
|
||||||
|
repo.remotes.origin.pull()
|
||||||
|
print(repo)
|
||||||
|
return repo
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def compare_with_branch(repo, branch):
|
||||||
|
diff = repo.git.diff(branch)
|
||||||
|
return diff
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_branches(repo):
|
||||||
|
branches = []
|
||||||
|
refs = repo.remote().refs
|
||||||
|
for ref in refs:
|
||||||
|
branches.append(ref)
|
||||||
|
return branches
|
|
@ -0,0 +1,14 @@
|
||||||
|
from tests.base_test import BaseTest
|
||||||
|
|
||||||
|
from crc.services.git_service import GitService
|
||||||
|
|
||||||
|
|
||||||
|
# class TestGitService(BaseTest):
|
||||||
|
|
||||||
|
# def test_push_to_remote(self):
|
||||||
|
# result = GitService().push_to_remote()
|
||||||
|
# print(result)
|
||||||
|
#
|
||||||
|
# def test_pull_from_remote(self):
|
||||||
|
# result = GitService.pull_from_remote()
|
||||||
|
# print(result)
|
Loading…
Reference in New Issue