add build scripts
This commit is contained in:
parent
05f53a9171
commit
90acc2baf7
9 changed files with 299 additions and 0 deletions
0
build/__init__.py
Normal file
0
build/__init__.py
Normal file
5
build/build/__init__.py
Normal file
5
build/build/__init__.py
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
from .build import build
|
||||||
|
|
||||||
|
__all__ = [
|
||||||
|
'build'
|
||||||
|
]
|
116
build/build/build.py
Normal file
116
build/build/build.py
Normal file
|
@ -0,0 +1,116 @@
|
||||||
|
from pathlib import Path
|
||||||
|
from typing import Optional
|
||||||
|
|
||||||
|
import PyTeX
|
||||||
|
|
||||||
|
from .build_information import BuildInfo
|
||||||
|
|
||||||
|
|
||||||
|
def pytex_msg(msg: str):
|
||||||
|
print('[PyTeX] ' + msg)
|
||||||
|
|
||||||
|
|
||||||
|
class TexFileToFormat:
|
||||||
|
def __init__(self, src_path: Path, build_dir: Path):
|
||||||
|
self.src_path = src_path
|
||||||
|
self.build_path = build_dir
|
||||||
|
|
||||||
|
def format(self):
|
||||||
|
if '.pysty' in self.src_path.name:
|
||||||
|
formatter = PyTeX.PackageFormatter(
|
||||||
|
package_name=self.src_path.with_suffix('').name,
|
||||||
|
extra_header=[]) # TODO: extra header
|
||||||
|
else:
|
||||||
|
formatter = PyTeX.ClassFormatter(
|
||||||
|
class_name=self.src_path.with_suffix('').name,
|
||||||
|
extra_header=[]) # TODO
|
||||||
|
pytex_msg('Writing file {}'.format(formatter.file_name))
|
||||||
|
formatter.make_default_macros()
|
||||||
|
formatter.format_file(self.src_path, self.build_path)
|
||||||
|
|
||||||
|
|
||||||
|
def build(
|
||||||
|
src_dir: Optional[Path] = None,
|
||||||
|
build_dir: Optional[Path] = None,
|
||||||
|
input_file: Optional[Path] = None,
|
||||||
|
author: Optional[str] = None,
|
||||||
|
latex_name: str = 'prepend-author', # name handling
|
||||||
|
recursive: bool = False, # input control
|
||||||
|
include_timestamp: bool = False, # header
|
||||||
|
include_pytex_version: bool = False, # header
|
||||||
|
include_license: bool = False, # header
|
||||||
|
include_git_version: bool = False, # header
|
||||||
|
include_pytex_info_text: bool = False, # header
|
||||||
|
use_git: bool = False, # versioning
|
||||||
|
allow_dirty: bool = False, # versioning
|
||||||
|
overwrite_existing_files: bool = False, # output control
|
||||||
|
build_all: bool = False, # output control / versioning
|
||||||
|
write_build_information: bool = True, # meta
|
||||||
|
):
|
||||||
|
pytex_msg('Getting git repository information...')
|
||||||
|
current_build_info = BuildInfo(
|
||||||
|
include_timestamp=include_timestamp,
|
||||||
|
include_pytex_version=include_pytex_version,
|
||||||
|
include_license=include_license,
|
||||||
|
include_git_version=include_git_version,
|
||||||
|
include_pytex_info_text=include_pytex_info_text,
|
||||||
|
author=author,
|
||||||
|
pytex_repo=None, # TODO
|
||||||
|
packages_repo=None # TODO
|
||||||
|
)
|
||||||
|
old_build_info = {} # TODO: read this in from file
|
||||||
|
# extra_header += ['WARNING: Local changes to git repository detected.',
|
||||||
|
# ' The build will not be reproducible (!)']
|
||||||
|
|
||||||
|
files = []
|
||||||
|
if input_file:
|
||||||
|
files.append(input_file)
|
||||||
|
if src_dir:
|
||||||
|
if recursive:
|
||||||
|
for file in src_dir.rglob('*.pysty'):
|
||||||
|
files.append(file)
|
||||||
|
for file in src_dir.rglob('*.pycls'):
|
||||||
|
files.append(file)
|
||||||
|
else:
|
||||||
|
for file in src_dir.glob('*.pysty'):
|
||||||
|
files.append(file)
|
||||||
|
for file in src_dir.glob('*.pycls'):
|
||||||
|
files.append(file)
|
||||||
|
|
||||||
|
input_dir = src_dir if src_dir else input_file.parent
|
||||||
|
output_dir = build_dir if build_dir else input_file.parent
|
||||||
|
sources_to_build = []
|
||||||
|
for file in files:
|
||||||
|
sources_to_build.append(
|
||||||
|
TexFileToFormat(
|
||||||
|
src_path=file,
|
||||||
|
build_dir=output_dir / file.parent.relative_to(input_dir)
|
||||||
|
))
|
||||||
|
|
||||||
|
for source in sources_to_build:
|
||||||
|
source.format()
|
||||||
|
|
||||||
|
current_build_info = {
|
||||||
|
'build_time': '',
|
||||||
|
'packages': {
|
||||||
|
'built': '',
|
||||||
|
'skipped': ''
|
||||||
|
},
|
||||||
|
'classes': {
|
||||||
|
'built': '',
|
||||||
|
'skipped': ''
|
||||||
|
},
|
||||||
|
'LatexPackages': {
|
||||||
|
'version': '',
|
||||||
|
'branch': '',
|
||||||
|
'commit': '',
|
||||||
|
'dirty': ''
|
||||||
|
},
|
||||||
|
'PyTeX': {
|
||||||
|
'version': '',
|
||||||
|
'branch': '',
|
||||||
|
'commit': '',
|
||||||
|
'dirty': ''
|
||||||
|
}
|
||||||
|
}
|
||||||
|
pytex_msg('Build done')
|
76
build/build/build_information.py
Normal file
76
build/build/build_information.py
Normal file
|
@ -0,0 +1,76 @@
|
||||||
|
import git
|
||||||
|
import datetime
|
||||||
|
from typing import Optional
|
||||||
|
|
||||||
|
from PyTeX.build.git_hook import git_describe, get_latest_commit
|
||||||
|
|
||||||
|
from .config import BUILD_DETAILS
|
||||||
|
|
||||||
|
|
||||||
|
def build_information():
|
||||||
|
repo = git.Repo()
|
||||||
|
repo_description = git_describe(get_latest_commit(repo))
|
||||||
|
pytex_repo = repo.submodule('PyTeX').module()
|
||||||
|
pytex_repo_description = git_describe(get_latest_commit(pytex_repo))
|
||||||
|
return list(map(lambda line: line.format(
|
||||||
|
build_time=datetime.datetime.now().strftime('%Y/%m/%d %H:%M'),
|
||||||
|
pytex_version=pytex_repo_description,
|
||||||
|
pytex_commit_hash=get_latest_commit(pytex_repo).hexsha[0:7],
|
||||||
|
packages_version=repo_description,
|
||||||
|
packages_commit_hash=get_latest_commit(repo).hexsha[0:7]
|
||||||
|
), BUILD_DETAILS)), repo_description
|
||||||
|
|
||||||
|
|
||||||
|
class BuildInfo:
|
||||||
|
def __init__(
|
||||||
|
self,
|
||||||
|
include_timestamp: bool = False,
|
||||||
|
include_pytex_version: bool = False,
|
||||||
|
include_license: bool = False,
|
||||||
|
include_git_version: bool = False,
|
||||||
|
include_pytex_info_text: bool = False,
|
||||||
|
author: Optional[str] = None,
|
||||||
|
pytex_repo: Optional[git.Repo] = None,
|
||||||
|
packages_repo: Optional[git.Repo] = None):
|
||||||
|
self.author = author
|
||||||
|
|
||||||
|
self._pytex_repo = pytex_repo
|
||||||
|
self._packages_repo = packages_repo
|
||||||
|
self._pytex_repo_commit = None
|
||||||
|
self._packages_repo_commit = None
|
||||||
|
self._pytex_repo_version = None
|
||||||
|
self._packages_repo_version = None
|
||||||
|
|
||||||
|
self._header = None
|
||||||
|
|
||||||
|
self.get_repo_commits()
|
||||||
|
self.get_repo_version()
|
||||||
|
|
||||||
|
self.create_header(
|
||||||
|
include_timestamp=include_timestamp,
|
||||||
|
include_pytex_version=include_pytex_version,
|
||||||
|
include_license=include_license,
|
||||||
|
include_git_version=include_git_version,
|
||||||
|
include_pytex_info_text=include_pytex_info_text
|
||||||
|
)
|
||||||
|
|
||||||
|
def get_repo_commits(self):
|
||||||
|
if self._packages_repo:
|
||||||
|
self._packages_repo_commit = get_latest_commit(self._packages_repo)
|
||||||
|
if self._pytex_repo:
|
||||||
|
self._pytex_repo_commit = get_latest_commit(self._pytex_repo)
|
||||||
|
|
||||||
|
def get_repo_version(self):
|
||||||
|
if self._packages_repo_commit:
|
||||||
|
self._packages_repo_version = git_describe(self._packages_repo_commit)
|
||||||
|
if self._pytex_repo_commit:
|
||||||
|
self._pytex_repo_version = git_describe(self._pytex_repo_commit)
|
||||||
|
|
||||||
|
def create_header(
|
||||||
|
self,
|
||||||
|
include_timestamp: bool = False,
|
||||||
|
include_pytex_version: bool = False,
|
||||||
|
include_license: bool = False,
|
||||||
|
include_git_version: bool = False,
|
||||||
|
include_pytex_info_text: bool = False):
|
||||||
|
pass
|
10
build/build/config.py
Normal file
10
build/build/config.py
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
BUILD_DETAILS = [
|
||||||
|
"Build details:",
|
||||||
|
" Build time: {build_time}",
|
||||||
|
" PyTeX version: {pytex_version} (commit {pytex_commit_hash})",
|
||||||
|
" LatexPackages version: {packages_version} (commit {packages_commit_hash})"
|
||||||
|
]
|
||||||
|
|
||||||
|
FILENAME_TYPE_PREPEND_AUTHOR = 'prepend-author'
|
||||||
|
FILENAME_TYPE_RAW_NAME = 'raw'
|
||||||
|
DATE_FORMAT = '%Y/%m/%d %H:%M'
|
9
build/git_hook/__init__.py
Normal file
9
build/git_hook/__init__.py
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
from .git_version import git_describe, get_history, get_latest_commit
|
||||||
|
from .recent import is_recent
|
||||||
|
|
||||||
|
__all__ = [
|
||||||
|
'git_describe',
|
||||||
|
'get_history',
|
||||||
|
'get_latest_commit',
|
||||||
|
'is_recent'
|
||||||
|
]
|
53
build/git_hook/git_version.py
Normal file
53
build/git_hook/git_version.py
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
import git
|
||||||
|
from typing import Dict
|
||||||
|
|
||||||
|
|
||||||
|
def get_latest_commit(repo):
|
||||||
|
if repo.head.is_detached:
|
||||||
|
return repo.head.commit
|
||||||
|
else:
|
||||||
|
return repo.head.ref.commit
|
||||||
|
|
||||||
|
|
||||||
|
def get_history(commit: git.objects.commit.Commit, priority=0, depth=0) -> Dict:
|
||||||
|
commit_history = {commit.hexsha: {
|
||||||
|
'priority': priority,
|
||||||
|
'depth': depth
|
||||||
|
}}
|
||||||
|
try:
|
||||||
|
if len(commit.parents) > 0:
|
||||||
|
commit_history.update(get_history(commit.parents[0], priority, depth + 1))
|
||||||
|
for parent in commit.parents[1:]:
|
||||||
|
commit_history.update(get_history(parent, priority + 1, depth + 1))
|
||||||
|
except ValueError:
|
||||||
|
pass
|
||||||
|
return commit_history
|
||||||
|
|
||||||
|
|
||||||
|
def git_describe(commit: git.objects.commit.Commit):
|
||||||
|
commit_history = get_history(commit)
|
||||||
|
latest_tag = None
|
||||||
|
for tag in commit.repo.tags:
|
||||||
|
sha = tag.commit.hexsha
|
||||||
|
if sha in commit_history.keys():
|
||||||
|
if latest_tag is None:
|
||||||
|
latest_tag = tag
|
||||||
|
elif commit_history[sha]['priority'] < commit_history[latest_tag.commit.hexsha]['priority']:
|
||||||
|
latest_tag = tag
|
||||||
|
elif commit_history[sha]['priority'] > commit_history[latest_tag.commit.hexsha]['priority']:
|
||||||
|
pass # move on
|
||||||
|
elif commit_history[sha]['depth'] < commit_history[latest_tag.commit.hexsha]['depth']:
|
||||||
|
latest_tag = tag
|
||||||
|
elif commit_history[sha]['depth'] > commit_history[latest_tag.commit.hexsha]['depth']:
|
||||||
|
pass # move on
|
||||||
|
elif tag.object.tagged_date > latest_tag.object.tagged_date:
|
||||||
|
latest_tag = tag
|
||||||
|
if latest_tag is None:
|
||||||
|
return "No tags found - cannot describe anything."
|
||||||
|
else:
|
||||||
|
msg = latest_tag.name
|
||||||
|
if commit_history[latest_tag.commit.hexsha]['depth'] != 0:
|
||||||
|
msg += "-{depth}".format(depth=commit_history[latest_tag.commit.hexsha]['depth'])
|
||||||
|
if commit.repo.is_dirty(untracked_files=True):
|
||||||
|
msg += '-*'
|
||||||
|
return msg
|
30
build/git_hook/recent.py
Normal file
30
build/git_hook/recent.py
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
import git
|
||||||
|
|
||||||
|
from .git_version import get_latest_commit
|
||||||
|
from typing import Union, Optional, List
|
||||||
|
|
||||||
|
|
||||||
|
def is_recent(file, repo, compare: Optional[Union[git.Commit, List[git.Commit]]] = None) -> Optional[bool]:
|
||||||
|
modified_files = [item.a_path for item in repo.index.diff(None)]
|
||||||
|
if file in modified_files:
|
||||||
|
return True
|
||||||
|
|
||||||
|
newly_committed_files = []
|
||||||
|
if type(compare) == git.Commit:
|
||||||
|
newly_committed_files = [item.a_path for item in repo.index.diff(compare)]
|
||||||
|
elif type(compare) == list:
|
||||||
|
for commit in compare:
|
||||||
|
for item in repo.index.diff(commit):
|
||||||
|
newly_committed_files.append(item.a_path)
|
||||||
|
elif type is None:
|
||||||
|
for parent in get_latest_commit(repo).parents:
|
||||||
|
for item in repo.index.diff(parent):
|
||||||
|
newly_committed_files.append(item.a_path)
|
||||||
|
else:
|
||||||
|
print("Invalid argument type for compare")
|
||||||
|
return None
|
||||||
|
|
||||||
|
if file in newly_committed_files:
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
return False
|
0
build/utils/__init__.py
Normal file
0
build/utils/__init__.py
Normal file
Loading…
Reference in a new issue