#!/usr/bin/python # -*- coding: utf-8 -*- # --------------------------------------------------------------------------------------------------------- # Author : Ulrich Carmesin # Source : gitea.ucarmesin.de # --------------------------------------------------------------------------------------------------------- import os import re import subprocess import sys import basic.toolHandling import utils.data_const as D import basic.constants as B import basic.text_const as T import utils.date_tool DEFAULT_CNT_COMMITS = 10 COMMIT_ID = "commit" COMMIT_AUTHOR = "author" COMMIT_DATE = "date" COMMIT_COMMENT = "comment" REPO_NAME = "name" REPO_URL = "url" REPO_BRANCH = "branch" def execCmd(job, repo, cmd): """ executes the command on the repository :param job: :param repo: :param cmd: :return: """ cdpath = "" if os.path.isdir(repo): cdpath = repo elif repo in job.conf[B.SUBJECT_PATH]: cdpath = job.conf[B.SUBJECT_PATH][repo] else: raise Exception(T.EXP_PATH_MISSING, repo) print("execCmd on " + cdpath + ": " + cmd) os.chdir(cdpath) text = "" process = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True) btext = process.communicate()[0] text = btext.decode('utf-8') return text def gitStatus(job, repo): text = execCmd(job, repo, "git status") return text def gitLog(job, repo, arg="", cnt=DEFAULT_CNT_COMMITS): """ extracts the last cnt commits into th structure :param job: :param repo: :param cnt: :return: [ {commit: "", author: ] """ if len(arg) > 1: arg = " -- "+arg else: arg = "" text = execCmd(job, repo, "git log -n "+str(cnt)+" --pretty=format:\"%H | %cn | %cd | %s\""+arg) print(text+"\n\n") logs = [] i = 0 for l in text.split("\n"): if i == cnt: break res = {} a = l.split("|") print(str(a)) if len(a) < 2: continue res[COMMIT_ID] = a[0].strip() res[COMMIT_AUTHOR] = a[1].strip() cdate = utils.date_tool.parseDate(a[2].strip()) res[COMMIT_DATE] = utils.date_tool.getFormatDatetupel(cdate, utils.date_tool.F_TIME_DEFAULT) res[COMMIT_COMMENT] = a[3].strip() logs.append(res) i += 1 print(str(logs)) return logs def gitCommits(job, repo, arg=""): if len(arg) > 1: arg = " -- "+arg else: arg = "" text = execCmd(job, repo, "git log --pretty=format:\"%H | %cn | %cd | %s\""+arg) print(text) def checkoutLocal(job, local): os.chdir(local["url"]) cmd = "git checkout " + local["branch"] execCmd(job, cmd) def updateLocal(job, local, repo): job.m.logInfo("--- aktualisiere git-Repo "+str(repo)+","+str(local)) checkoutLocal(job, local) cmd = "git pull " + repo["name"] + " " + repo["branch"] execCmd(job, cmd) os.chdir(job.home) def updateRemote(job, local, repo): job.m.logInfo("--- aktualisiere git-Repo "+str(repo)+","+str(local)) checkoutLocal(job, local) cmd = "git push " + repo["name"] + " " + repo["branch"] execCmd(job, cmd) os.chdir(job.home) def gitPull(job, repo): if "git" not in job.conf[B.SUBJECT_TOOL] or repo not in job.conf[B.SUBJECT_TOOL]["git"]: raise Exception(T.EXP_CONFIG_MISSING, "tool.git."+repo) #print(str(job.conf[B.SUBJECT_TOOL]["git"][repo])) master = job.conf[B.SUBJECT_TOOL]["git"][repo]["master"] remote = job.conf[B.SUBJECT_TOOL]["git"][repo]["remote"] text = execCmd(job, repo, "git status") if "Commit vor" in text: print("Das Repository "+repo+" bitte zuerst pushen \n") #print(text+"\"-------------------------------------\n") else: print("Repository "+repo+" kann gepullt werden.") #execCmd(job, repo, "git pull "+remote+" "+master)