Ловушка precommit возвращает список отмеченных отмеченных файлов в tortoiseHg
Ловушка precommit возвращает список отмеченных отмеченных файлов в tortoiseHg
Так что, в основном, я пишу ловушку перед фиксацией, которая статически проанализирует код и выдаст мне HTML-отчет об ошибке.
Что я сделал: я сделал с
Получить список файлов MODIFIED и ADDED и запустить на нем статический анализатор кода.
Получите Результат в виде HTML. Большая часть работы выполнена, но проблема в том, как получить список файлов, помеченных галочкой, в TortoiseHg, Не во всех списках ДОБАВЛЕННЫХ и ИЗМЕНЕННЫХ файлов.
Таким образом, в списке файлов только 2 файла в этом примере: 1. .classpath 2. servlet-api.jar
В основном я хочу прочитать tortoiseHg Ui в скрипте Python:) Заранее спасибо
0 ответов
После многих лет исследований и чтения аюрведических книг
Просто шучу...............
Итак, наконец, я смог написать сценарий хуков перед фиксацией через несколько дней после того, как разместил здесь вопрос!
Предварительные условия:
- Python выше версии 2 или любой дистрибутив версии 3
- Запущенный экземпляр SonarQube
- файл sonar-scanner.properties
Таким образом, хук предварительной фиксации
import subprocess
import re
import os
import json
from tkinter import *
print(os.getcwd())
#get current working directory echo pwd
repoPath = os.getcwd()
#hg status -a -m gives the modified files and added files
#git status --porcelain
cmd = "hg status -a -m"
#this is the html file name to show report errors
sonarScannedReport = 'SonarScannedReport.html'
# returns output as byte string
returned_output = subprocess.check_output(cmd)
# List of Modified and Added files
fileList = returned_output.splitlines()
fileList = list(fileList)
# iterate over list and find .java files
# seperate list with "." seprator
javaFilesAbsolutePaths = []
for file in fileList:
fileExtList = file.decode("utf-8").split(".")
if fileExtList[1] == "java":
fileRelativePath = re.split('A |M ', file.decode("utf-8"))
javaFilesAbsolutePaths.append(os.path.abspath(fileRelativePath[1].replace('/', '\\')))
# Working Directory to PMD working Directory
def getOutputFileName(java_file):
fileArr = java_file.split("\\")
return fileArr[len(fileArr) - 1].split('.')[0]
issue_found = False
javaFiles = ""
i = 0
for javaFile in javaFilesAbsolutePaths:
if i == 0:
javaFiles = javaFile
else:
javaFiles = javaFiles + "," + javaFile
# javaFiles comma separated string and now run sonar command on it.
cmd1 = " -Dsonar.analysis.mode=preview -Dsonar.issuesReport.console.enable=true "
cmd2 = "-Dsonar.java.binaries=" + repoPath.replace('\\',
'/') + "/CatalystOne/res/WEB-INF/classes -Dsonar.issuesReport.json.enable"
cmd = "sonar-scanner -Dsonar.sources=" + javaFiles + cmd1 + cmd2
outputJsonFile = ""
AbsPath = ""
try:
p2 = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
(output2, err2) = p2.communicate()
p2_status = p2.wait()
output = output2.decode("utf-8").splitlines()
for o in output:
if "INFO: Export issues to" in o:
AbsPath = os.getcwd() + "\\.scannerwork\\sonar-report.json"
break
if AbsPath == "":
print("Problem with Sonar Scanner Connections")
exit(1)
with open(AbsPath, 'r') as f:
array = json.load(f)
issues = array['issues']
f = open(sonarScannedReport, 'w')
HTML_OPEN = "<html><head><title>Sonar scanner report </title></head><body align='center'>"
TABLE_OPEN = "<table>"
TR_OPEN = "<tr>"
TR_CLOSE = "</tr>"
TH_OPEN = "<th>"
TH_CLOSE = "</th>"
TD_OPEN = "<td>"
TD_CLOSE = "</td>"
TABLE_CLOSE = "</table>"
HTML_CLOSE = "</body></html>"
table_header = TR_OPEN + TH_OPEN + "FILE" + TH_CLOSE + TH_OPEN + "L. NO" + TH_CLOSE + TH_OPEN + "Message" + TH_CLOSE + TH_OPEN + "Severity" + TH_CLOSE + TH_OPEN + "Rule" + TH_CLOSE + TR_CLOSE
f.write(HTML_OPEN)
f.write(TABLE_OPEN)
f.write(table_header)
for issue in issues:
fileName = issue['component'].split(':')[1]
if 'line' in issue:
lineNo = str(issue['line'])
else:
lineNo = ""
if 'rule' in issue:
rule = str(issue['rule'])
else:
rule = ""
issue_found = True;
tr = TR_OPEN + TD_OPEN + fileName + TD_CLOSE + \
TD_OPEN + lineNo + TD_CLOSE + \
TD_OPEN + issue['message'] + TD_CLOSE + \
TD_OPEN + issue['severity'] + TD_CLOSE + \
TD_OPEN + rule + TD_CLOSE + \
TR_CLOSE
f.write(tr)
f.write(TABLE_CLOSE)
f.write(HTML_CLOSE)
f.close()
except ValueError:
print(ValueError)
if issue_found:
errorMsg = "Please open following file to problems with your code :) "
reportFilePath = os.getcwd() + "\\" + sonarScannedReport
window = Tk()
window.title("Error report")
window.geometry('550x100')
lbl = Label(window, text=errorMsg + " \n " + reportFilePath)
lbl.grid(column=0, row=0)
window.mainloop()
exit(1)
else:
exit(0)
Скоро напишу ридми для Github или могу сделать туториал