diff --git a/git.py b/git.py index cf8ee8193..3c5ff6817 100644 --- a/git.py +++ b/git.py @@ -42,7 +42,8 @@ def getGitProjectName(baseDir: str, nickname: str, domain: str, def isGitPatch(baseDir: str, nickname: str, domain: str, messageType: str, - subject: str, content: str) -> bool: + subject: str, content: str, + checkProjectName=True) -> bool: """Is the given post content a git patch? """ if messageType != 'Note' and \ @@ -57,6 +58,8 @@ def isGitPatch(baseDir: str, nickname: str, domain: str, return False if 'diff ' not in content: return False + if 'From ' not in content: + return False if 'From:' not in content: return False if 'Date:' not in content: @@ -66,11 +69,11 @@ def isGitPatch(baseDir: str, nickname: str, domain: str, if '
' not in content: if '
' not in content: return False - projectName = \ - getGitProjectName(baseDir, nickname, domain, - subject) - if not projectName: - return False + if checkProjectName: + projectName = \ + getGitProjectName(baseDir, nickname, domain, subject) + if not projectName: + return False return True @@ -88,6 +91,48 @@ def getGitHash(patchStr: str) -> str: return None +def convertPostToCommit(baseDir: str, nickname: str, domain: str, + postJsonObject: {}) -> bool: + """Detects whether the given post contains a patch + and if so then converts it to a Commit ActivityPub type + """ + if not postJsonObject.get('object'): + return False + if not isinstance(postJsonObject['object'], dict): + return False + if not postJsonObject['object'].get('type'): + return False + if postJsonObject['object']['type'] == 'Commit': + return True + if not postJsonObject['object'].get('summary'): + return False + if not postJsonObject['object'].get('content'): + return False + if not postJsonObject['object'].get('attributedTo'): + return False + if not isGitPatch(baseDir, nickname, domain, + postJsonObject['object']['type'], + postJsonObject['object']['summary'], + postJsonObject['object']['content'], + False): + return False + postJsonObject['object']['type'] = 'Commit' + # add a commitedBy parameter + if not postJsonObject['object'].get('committedBy'): + postJsonObject['object']['committedBy'] = \ + postJsonObject['object']['attributedTo'] + patchStr = gitFormatContent(postJsonObject['object']['content']) + commitHash = getGitHash(patchStr) + if commitHash: + postJsonObject['object']['hash'] = commitHash + postJsonObject['object']['description'] = { + "mediaType": "text/plain", + "content": patchStr + } + print('Converted post to Commit type') + return True + + def gitAddFromHandle(patchStr: str, handle: str) -> str: """Adds the activitypub handle of the sender to the patch """ diff --git a/posts.py b/posts.py index e64be8b86..ecebc8d29 100644 --- a/posts.py +++ b/posts.py @@ -49,6 +49,7 @@ from auth import createBasicAuthHeader from config import getConfigParam from blocking import isBlocked from filters import isFiltered +from git import convertPostToCommit # try: # from BeautifulSoup import BeautifulSoup # except ImportError: @@ -795,6 +796,10 @@ def createPostBase(baseDir: str, nickname: str, domain: str, port: int, modFile.write(newPostId + '\n') modFile.close() + # If a commit has been posted - i.e. the output from + # git format-patch - then convert the activitypub type + convertPostToCommit(baseDir, nickname, domain, newPost) + if schedulePost: if eventDate and eventTime: # add an item to the scheduled post index file