This commit is contained in:
Patrick Lühne 2018-06-22 14:27:25 +02:00
parent 996bd42ed7
commit 2a214ff0ba
Signed by: patrick
GPG Key ID: 05F3611E97A70ABF
3 changed files with 124 additions and 0 deletions

22
benchmark-new/benchmark.py Executable file
View File

@ -0,0 +1,22 @@
#!/usr/bin/python3
import subprocess
import yaml
from benchmark_repository import BenchmarkRepository
def executeCommand(command, stdin = None, cwd = None):
with subprocess.Popen(command, stdout = subprocess.PIPE, stderr = subprocess.PIPE, stdin = (subprocess.PIPE if stdin != None else None), cwd = cwd) as process:
stdout, stderr = process.communicate(input = (stdin.encode("utf-8") if stdin != None else None))
exitCode = process.returncode
return stdout.decode("utf-8"), stderr.decode("utf-8"), exitCode
def main():
with open("config.yml", "r") as stream:
config = yaml.load(stream, Loader = yaml.CLoader)
benchmarkRepository = BenchmarkRepository(config["repository"])
if __name__ == "__main__":
main()

View File

@ -0,0 +1,81 @@
#!/usr/bin/python3
import math
import os
import pygit2
import shutil
import sys
def printProgressBar(title, value, total, overwrite = False):
terminalSize = shutil.get_terminal_size((80, 20))
progress = value / total if total > 0 else 1
progressText = "{: >3d} %".format(math.floor(progress * 100))
remainingWidth = terminalSize.columns - len(title) - len(progressText) - 4
progressBarWidth = min(remainingWidth, 94)
blankWidth = remainingWidth - progressBarWidth
filledWidth = math.floor(progressBarWidth * progress)
progressBar = "#" * filledWidth + "-" * (progressBarWidth - filledWidth)
if overwrite:
print("\x1b[1A\x1b[2K", end = "")
print("{} {}[{}] {}".format(title, " " * blankWidth, progressBar, progressText))
def printCloneProgress(transferProgress):
printProgressBar("Cloning the repository", transferProgress.received_objects, transferProgress.total_objects, overwrite = True)
def printFetchProgress(transferProgress):
printProgressBar("Updating the repository", transferProgress.received_objects, transferProgress.total_objects, overwrite = True)
class BenchmarkRepository:
def __init__(self, config):
self.basePath = config["basePath"]
self.remote = config["remote"]
self.remoteUser = config["remoteUser"]
self.userName = config["userName"]
self.userEMail = config["userEMail"]
self.userSigningKey = config["userSigningKey"] if "userSigningKey" in config else None
self.branches = config["branches"] if "branches" in config else {"master": "master", "results": "results", "config": "config", "status": "status"}
self.statusLogSize = config["statusLogSize"]
remoteUser = pygit2.credentials.KeypairFromAgent(self.remoteUser)
callbacks = pygit2.RemoteCallbacks(credentials = remoteUser)
# check for an existing repository
if os.path.isdir(self.branchDir("master")):
repositoryPath = pygit2.discover_repository(self.branchDir("master"))
if repositoryPath is None:
raise Exception("{} exists but is not a Git directory".format(self.branchDir("master")))
callbacks.transfer_progress = printFetchProgress
self.repository = pygit2.Repository(repositoryPath)
for remote in self.repository.remotes:
printProgressBar("Updating the repository", 0, 1)
remote.fetch(callbacks = callbacks)
printProgressBar("Updating the repository", 1, 1, overwrite = True)
try:
pass
#self.repository.lookup_worktree("results")
#self.repository.lookup_worktree("config")
#self.repository.lookup_worktree("status")
except pygit2.GitError:
raise Exception("Worktrees are not properly set up")
else:
callbacks.transfer_progress = printCloneProgress
printProgressBar("Cloning the repository", 0, 1)
self.repository = pygit2.clone_repository(self.remote, self.branchDir("master"), callbacks = callbacks, checkout_branch = self.branches["master"])
printProgressBar("Cloning the repository", 1, 1, overwrite = True)
for branchName in ["results", "config", "status"]:
worktree = self.repository.add_worktree(branchName, self.branchDir(branchName))
worktree = pygit2.Repository(worktree.path)
branch = worktree.branches.local.create(branchName)
#worktree.checkout(self.branches["results"])
def branchDir(self, branchName):
return os.path.join(self.basePath, branchName)

21
benchmark-new/config.yml Normal file
View File

@ -0,0 +1,21 @@
repository:
# local directory where remote is cloned to
basePath: storage
# repote Git repository URL
remote: git@git.luehne.de:patrick/tplp-planning-benchmark.git
# user name of the SSH key pair with access to the remote
remoteUser: git
# user name for commits
userName: potassco-bot
# user e-mail for commits
userEMail: bot@potassco.org
# user GPG key for signing commits (optional)
# userSigningKey: 12345678
# data branches
branches:
master: master
results: test-results
config: test-config
status: test-status
# the maximum size of the status log in lines
statusLogSize: 100