def updateChangelog(self): if self.changelog.isPrevious(): self.changelog.showPrevious() if User.yesNo("A previous Changelog excerpt was found. Use it?"): self.changelog.usePrevious() if not self.changelog.usingPrevious(): date = datetime.now().strftime('%Y-%m-%d') testersList = "" testers = self.testers.getListOk() authorsList = "" authors = Git.getAuthorsList(currentVersion) for tester in testers: testersList += "- {}\n".format(tester.getName()) for author in authors: authorsList += "- {} ({})\n".format( author.getName(), author.getCount() ) commitsList = Git.getCommitsList(currentVersion) date = datetime.now().strftime('%Y-%m-%d') self.changelog.writeExcerpt( newVersion, date, testersList, authorsList, commitsList ) self.changelog.edit() self.changelog.update()
def updateAPI(self): req = "update API of the website? (requires {})".format(SPHINXBUILD) if User.yesNo(req, defaultToYes=True) is False: return False try: if check_call(shlex.split("{} --version".format(SPHINXBUILD))) != 0: raise RuntimeError("{} not found".format(SPHINXBUILD)) except: print(""" Oops! you don't have {} installed?" Cannot update the webite documentation..." You should install it and manually run:" $ cd {}" $ make websitedoc" Then, commit and push changes of the website.""".format(SPHINXBUILD, DOCSDIR)) User.pause() return False Git.chdirToRepositoryTopLevel() if not goTo('website'): User.pause() return False if not Git.isClean: print("There is WIP in the website repository: stashing") Git.stash('WIP during offlineimap API import') goTo('..') return True
def exportDocs(self, version): branchName = "import-v{}".format(version) if not goTo(DOCSDIR): User.pause() return if check_call(shlex.split("make websitedoc")) != 0: print("error while calling 'make websitedoc'") exit(3) Git.chdirToRepositoryTopLevel() if not goTo("website"): User.pause() return Git.checkout(branchName, create=True) Git.add('.') Git.commit("update for offlineimap v{}".format(version)) User.pause( "website: branch '{}' is ready for a merge in master!".format( branchName)) goTo('..') return branchName
def createImportBranch(self, version): branchName = "import-v{}".format(version) Git.chdirToRepositoryTopLevel() if not goTo("website"): User.pause() return Git.checkout(branchName, create=True) Git.add('.') Git.commit("update for offlineimap v{}".format(version)) User.pause( "website: branch '{}' is ready for a merge in master!".format( branchName)) goTo('..') return branchName
def restore(self): Git.chdirToRepositoryTopLevel() try: Git.checkout('-f') except: pass # Git.checkout('master') # Git.resetKeep(self.master) # Git.checkout('next') # Git.resetKeep(self.next) if self.tag is not None: Git.rmTag(self.tag) if self.website is not None: if goTo('website'): Git.checkout(self.website) goTo('..')
def make(self): Git.add('offlineimap/__init__.py') Git.add('Changelog.md') commitMsg = "v{}\n".format(newVersion) for tester in self.testers.getListOk(): commitMsg = "{}\nTested-by: {} {}".format( commitMsg, tester.getName(), tester.getEmail() ) Git.commit(commitMsg) self.state.setTag(newVersion) Git.tag(newVersion) Git.checkout('master') Git.mergeFF('next') Git.checkout('next')
def prepare(self): if not Git.isClean(): print("The git repository is not clean; aborting") exit(1) Git.makeCacheDir() Git.checkout('next')
def buildLatest(self, version): Git.chdirToRepositoryTopLevel() with open(WEBSITE_LATEST, 'w') as fd: fd.write(WEBSITE_LATEST_SKEL.format(stable=version))
def saveWebsite(self): Git.chdirToRepositoryTopLevel() goTo('website') self.website = Git.getRef('master') goTo('..')
def save(self): self.master = Git.getRef('master') self.next = Git.getRef('next')
return self.websiteBranch def after(self): for protectedRun in [self.testers.reset, self.changelog.savePrevious]: try: protectedRun() except Exception as e: print(e) def restore(self): self.state.restore() if __name__ == '__main__': release = Release() Git.chdirToRepositoryTopLevel() try: release.prepare() currentVersion = release.getVersion() release.requestVersion(currentVersion) release.updateVersion() newVersion = release.getVersion() release.checkVersions(currentVersion, newVersion) release.updateChangelog() release.writeAnnounce() User.pause()
# # I aim to make the new release in one week, approximately. If you'd like more # time, please let me know. ,-) # # Please, send me a mail to confirm it works for you. This will be written in the # release notes and the git logs. # # ## Authors # if __name__ == '__main__': offlineimapInfo = OfflineimapInfo() print("Will read headers from {}".format(UPCOMING_HEADER)) Git.chdirToRepositoryTopLevel() oVersion = offlineimapInfo.getVersion() ccList = Testers.listTestersInTeam() authors = Git.getAuthorsList(oVersion) for author in authors: email = author.getEmail() if email not in ccList: ccList.append(email) with open(UPCOMING_FILE, 'w') as upcoming, \ open(UPCOMING_HEADER, 'r') as fd_header: header = {} header['messageId'] = Git.buildMessageId() header['date'] = Git.buildDate() header['name'], header['email'] = Git.getLocalUser()
self.listTesters() number = User.request(msg) while number.lower() not in ['s', 'save', 'q', 'quit']: if number == '': continue try: number = int(number) self.feedbacks[number].switchFeedback() except (ValueError, IndexError) as e: print(e) exit(1) finally: self.listTesters() number = User.request(msg) if number in ['s', 'save']: self.testers.write() self.listTesters() def reset(self): self.testers.reset() self.testers.write() #def updateMailaliases(self): if __name__ == '__main__': Git.chdirToRepositoryTopLevel() app = App() app.parseArgs() app.run()