Giter Club home page Giter Club logo

topias's Introduction

Topias โ€” IntelliJ IDEA plugin for visualization of VCS changes frequency.

Build Status

Shows changes count of methods since the beginning of project history as a read-only text labels with information about changes count for a period of time and a histogram with changes count per day above the method's signature.

Download

https://plugins.jetbrains.com/plugin/12564-topias

Plugin demo video

https://youtu.be/xsqc4gCTxfA

How to use

Just install plugin from official JetBrains repository, and it will find a VCS root in your Java project. If VCS root was not found, you could set it manually in plugin's settings (Settings -> Topias plugin settings).

Screenshots

pic

pic1

topias's People

Contributors

anastasijakravtsova avatar evalle avatar svitkovsergey avatar

Stargazers

 avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

topias's Issues

liquibase.exception.ChangeLogParseException: /db/db.changelog.xml does not exist

liquibase.exception.ChangeLogParseException: /db/db.changelog.xml does not exist
	at liquibase.parser.core.xml.XMLChangeLogSAXParser.parseToNode(XMLChangeLogSAXParser.java:106)
	at liquibase.parser.core.xml.AbstractChangeLogParser.parse(AbstractChangeLogParser.java:15)
	at liquibase.Liquibase.getDatabaseChangeLog(Liquibase.java:217)
	at liquibase.Liquibase.update(Liquibase.java:190)
	at liquibase.Liquibase.update(Liquibase.java:179)
	at db.DatabaseInitialization.createNewDatabase(DatabaseInitialization.java:40)
	at processing.FullProcessInvoker.invoke(FullProcessInvoker.java:23)
	at handlers.ide.ProjectOpenListener.projectOpened(ProjectOpenListener.java:30)
	at com.intellij.openapi.project.impl.ProjectManagerImpl.lambda$fireProjectOpened$19(ProjectManagerImpl.java:856)
	at com.intellij.ide.startup.impl.StartupManagerImpl.runActivity(StartupManagerImpl.java:454)
	at com.intellij.openapi.project.impl.ProjectManagerImpl.fireProjectOpened(ProjectManagerImpl.java:852)
	at com.intellij.openapi.project.impl.ProjectManagerImpl.lambda$doLoadProject$9(ProjectManagerImpl.java:453)
	at com.intellij.openapi.application.TransactionGuardImpl.lambda$submitTransactionAndWait$2(TransactionGuardImpl.java:162)
	at com.intellij.openapi.application.TransactionGuardImpl.runSyncTransaction(TransactionGuardImpl.java:83)
	at com.intellij.openapi.application.TransactionGuardImpl.lambda$submitTransaction$1(TransactionGuardImpl.java:107)
	at com.intellij.openapi.application.impl.LaterInvocator$FlushQueue.doRun(LaterInvocator.java:441)
	at com.intellij.openapi.application.impl.LaterInvocator$FlushQueue.runNextEvent(LaterInvocator.java:424)
	at com.intellij.openapi.application.impl.LaterInvocator$FlushQueue.run(LaterInvocator.java:407)
	at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:313)
	at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:776)
	at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:727)
	at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
	at java.base/java.security.AccessController.doPrivileged(Native Method)
	at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
	at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:746)
	at com.intellij.ide.IdeEventQueue.defaultDispatchEvent(IdeEventQueue.java:906)
	at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:779)
	at com.intellij.ide.IdeEventQueue.lambda$dispatchEvent$8(IdeEventQueue.java:422)
	at com.intellij.openapi.progress.impl.CoreProgressManager.computePrioritized(CoreProgressManager.java:698)
	at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:421)
	at com.intellij.ide.IdeEventQueue.pumpEventsForHierarchy(IdeEventQueue.java:963)
	at com.intellij.openapi.progress.util.ProgressWindow.startBlocking(ProgressWindow.java:193)
	at com.intellij.openapi.progress.util.ProgressWindow.startBlocking(ProgressWindow.java:179)
	at com.intellij.openapi.application.impl.ApplicationImpl.runProcessWithProgressSynchronously(ApplicationImpl.java:455)
	at com.intellij.openapi.progress.impl.CoreProgressManager.runProcessWithProgressSynchronously(CoreProgressManager.java:453)
	at com.intellij.openapi.progress.impl.ProgressManagerImpl.runProcessWithProgressSynchronously(ProgressManagerImpl.java:82)
	at com.intellij.openapi.progress.impl.CoreProgressManager.runProcessWithProgressSynchronously(CoreProgressManager.java:250)
	at com.intellij.platform.ProjectUiFrameAllocator$run$1.run(ProjectFrameAllocator.kt:64)
	at com.intellij.openapi.application.TransactionGuardImpl.runSyncTransaction(TransactionGuardImpl.java:83)
	at com.intellij.openapi.application.TransactionGuardImpl.submitTransactionAndWait(TransactionGuardImpl.java:149)
	at com.intellij.platform.ProjectUiFrameAllocator.run(ProjectFrameAllocator.kt:62)
	at com.intellij.platform.PlatformProjectOpenProcessor.openExistingProject(PlatformProjectOpenProcessor.java:234)
	at com.intellij.platform.PlatformProjectOpenProcessor.doOpenProject(PlatformProjectOpenProcessor.java:192)
	at com.intellij.platform.PlatformProjectOpenProcessor.doOpenProject(PlatformProjectOpenProcessor.java:102)
	at com.intellij.openapi.externalSystem.importing.AbstractOpenProjectProvider.openPlatformProject(AbstractOpenProjectProvider.kt:82)
	at com.intellij.openapi.externalSystem.importing.AbstractOpenProjectProvider.openProject(AbstractOpenProjectProvider.kt:37)
	at org.jetbrains.plugins.gradle.service.project.open.GradleOpenProjectProvider.openProject(GradleOpenProjectProvider.kt:54)
	at org.jetbrains.plugins.gradle.service.project.open.GradleProjectImportUtil.openGradleProject(GradleProjectImportUtil.kt:18)
	at org.jetbrains.plugins.gradle.service.project.open.GradleProjectOpenProcessor.doOpenProject(GradleProjectOpenProcessor.kt:22)
	at com.intellij.ide.actions.ImportModuleAction.openProject(ImportModuleAction.java:132)
	at com.intellij.ide.actions.ImportModuleAction.doCreateFromWizard(ImportModuleAction.java:98)
	at com.intellij.ide.actions.ImportModuleAction.lambda$createFromWizard$0(ImportModuleAction.java:84)
	at com.intellij.openapi.application.TransactionGuardImpl.runSyncTransaction(TransactionGuardImpl.java:83)
	at com.intellij.openapi.application.TransactionGuardImpl.submitTransactionAndWait(TransactionGuardImpl.java:149)
	at com.intellij.ide.actions.ImportModuleAction.createFromWizard(ImportModuleAction.java:84)
	at com.intellij.ide.actions.ImportModuleAction.doImport(ImportModuleAction.java:78)
	at com.intellij.ide.actions.ImportProjectAction.actionPerformed(ImportProjectAction.java:30)
	at com.intellij.openapi.actionSystem.ex.ActionUtil$1.run(ActionUtil.java:266)
	at com.intellij.openapi.actionSystem.ex.ActionUtil.performActionDumbAware(ActionUtil.java:283)
	at com.intellij.openapi.actionSystem.ex.ActionUtil.invokeAction(ActionUtil.java:442)
	at com.intellij.openapi.actionSystem.ex.ActionUtil.invokeAction(ActionUtil.java:427)
	at com.intellij.ui.components.labels.ActionLink$1.linkSelected(ActionLink.java:45)
	at com.intellij.ui.components.labels.LinkLabel.doClick(LinkLabel.java:142)
	at com.intellij.ui.components.labels.ActionLink.doClick(ActionLink.java:54)
	at com.intellij.ui.components.labels.LinkLabel$MyMouseHandler.mouseReleased(LinkLabel.java:330)
	at java.desktop/java.awt.Component.processMouseEvent(Component.java:6651)
	at java.desktop/javax.swing.JComponent.processMouseEvent(JComponent.java:3342)
	at java.desktop/java.awt.Component.processEvent(Component.java:6416)
	at java.desktop/java.awt.Container.processEvent(Container.java:2263)
	at java.desktop/java.awt.Component.dispatchEventImpl(Component.java:5026)
	at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2321)
	at java.desktop/java.awt.Component.dispatchEvent(Component.java:4858)
	at java.desktop/java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4918)
	at java.desktop/java.awt.LightweightDispatcher.processMouseEvent(Container.java:4547)
	at java.desktop/java.awt.LightweightDispatcher.dispatchEvent(Container.java:4488)
	at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2307)
	at java.desktop/java.awt.Window.dispatchEventImpl(Window.java:2773)
	at java.desktop/java.awt.Component.dispatchEvent(Component.java:4858)
	at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:778)
	at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:727)
	at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
	at java.base/java.security.AccessController.doPrivileged(Native Method)
	at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
	at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:95)
	at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:751)
	at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:749)
	at java.base/java.security.AccessController.doPrivileged(Native Method)
	at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
	at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:748)
	at com.intellij.ide.IdeEventQueue.defaultDispatchEvent(IdeEventQueue.java:906)
	at com.intellij.ide.IdeEventQueue.dispatchMouseEvent(IdeEventQueue.java:844)
	at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:776)
	at com.intellij.ide.IdeEventQueue.lambda$dispatchEvent$8(IdeEventQueue.java:422)
	at com.intellij.openapi.progress.impl.CoreProgressManager.computePrioritized(CoreProgressManager.java:698)
	at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:421)
	at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
	at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)

Migrate from pure JDBC to Slick/Quill/Doobie

Since I decided to move this project to Scala, it also should move from pure JDBC & string hardcoded SQL queries to something nicer.
Investigate and choose one library for DB integration.

Exception while processing git history

java.lang.Throwable: Assertion failed
	at com.intellij.openapi.diagnostic.Logger.assertTrue(Logger.java:180)
	at com.intellij.openapi.diagnostic.Logger.assertTrue(Logger.java:189)
	at org.jetbrains.ide.BuiltInServerManagerImpl.waitForStart(BuiltInServerManagerImpl.kt:109)
	at org.jetbrains.git4idea.ssh.GitXmlRpcHandlerService.getXmlRcpPort(GitXmlRpcHandlerService.java:69)
	at git4idea.commands.GitHandlerAuthenticationManager.prepareHttpAuth(GitHandlerAuthenticationManager.java:106)
	at git4idea.commands.GitHandlerAuthenticationManager.lambda$prepare$0(GitHandlerAuthenticationManager.java:67)
	at git4idea.GitUtil.tryRunOrClose(GitUtil.java:1081)
	at git4idea.commands.GitHandlerAuthenticationManager.prepare(GitHandlerAuthenticationManager.java:66)
	at git4idea.commands.GitImplBase.run(GitImplBase.java:153)
	at git4idea.commands.GitImplBase.runCommand(GitImplBase.java:60)
	at processing.GitCommitsProcessor.lambda$processGitHistory$5(GitCommitsProcessor.java:94)
	at com.intellij.openapi.application.TransactionGuardImpl$2.run(TransactionGuardImpl.java:309)
	at com.intellij.openapi.application.impl.LaterInvocator$FlushQueue.doRun(LaterInvocator.java:441)
	at com.intellij.openapi.application.impl.LaterInvocator$FlushQueue.runNextEvent(LaterInvocator.java:424)
	at com.intellij.openapi.application.impl.LaterInvocator$FlushQueue.run(LaterInvocator.java:407)
	at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:313)
	at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:776)
	at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:727)
	at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
	at java.base/java.security.AccessController.doPrivileged(Native Method)
	at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
	at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:746)
	at com.intellij.ide.IdeEventQueue.defaultDispatchEvent(IdeEventQueue.java:906)
	at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:779)
	at com.intellij.ide.IdeEventQueue.lambda$dispatchEvent$8(IdeEventQueue.java:422)
	at com.intellij.openapi.progress.impl.CoreProgressManager.computePrioritized(CoreProgressManager.java:698)
	at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:421)
	at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
	at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)

plot of changes frequency

  1. - Datetime of method change must be somehow saved. May be even SQLite or smth like this should be used for saving whole data, because time range selection must be done ...
  2. - Plots of frequency of changes must be drawn somehow. Need to research this.

Exception from the plugin: executing git command from EDT

java.lang.Throwable: Synchronous execution on EDT: /usr/bin/git -c core.quotepath=false -c log.showSignature=false rev-list HEAD --count "--since=\"last month\""
	at com.intellij.openapi.diagnostic.Logger.error(Logger.java:145)
	at com.intellij.execution.process.OSProcessHandler.checkEdtAndReadAction(OSProcessHandler.java:118)
	at com.intellij.execution.process.OSProcessHandler.waitFor(OSProcessHandler.java:63)
	at git4idea.commands.GitTextHandler.waitForProcess(GitTextHandler.java:145)
	at git4idea.commands.GitHandler.runInCurrentThread(GitHandler.java:383)
	at git4idea.commands.GitImplBase.doRun(GitImplBase.java:172)
	at git4idea.commands.GitImplBase.run(GitImplBase.java:148)
	at git4idea.commands.GitImplBase.runCommand(GitImplBase.java:46)
	at git4idea.commands.GitImpl.runCommand(GitImpl.java:41)
	at processing.GitCommitsProcessor.lambda$processGitHistory$5(GitCommitsProcessor.java:94)
	at com.intellij.openapi.application.TransactionGuardImpl$2.run(TransactionGuardImpl.java:308)
	at com.intellij.openapi.application.impl.LaterInvocator$FlushQueue.doRun(LaterInvocator.java:433)
	at com.intellij.openapi.application.impl.LaterInvocator$FlushQueue.runNextEvent(LaterInvocator.java:416)
	at com.intellij.openapi.application.impl.LaterInvocator$FlushQueue.run(LaterInvocator.java:399)
	at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
	at java.awt.EventQueue.access$500(EventQueue.java:97)
	at java.awt.EventQueue$3.run(EventQueue.java:709)
	at java.awt.EventQueue$3.run(EventQueue.java:703)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
	at com.intellij.ide.IdeEventQueue.defaultDispatchEvent(IdeEventQueue.java:935)
	at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:812)
	at com.intellij.ide.IdeEventQueue.lambda$dispatchEvent$8(IdeEventQueue.java:471)
	at com.intellij.openapi.progress.impl.CoreProgressManager.computePrioritized(CoreProgressManager.java:705)
	at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:470)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:205)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

Support the most recent version of IntelliJ SDK

Currently this plugin can work only on IntelliJ versions 2018.3 and 2019.1 due to changes made in PSI package in 2019.2.
Plugin's code should be updated to comply with the most recent SDK version.

Cancel indexing from UI

Thank you for a great plugin!

Right now there is a notification down in the progress bar that "Git history is indexing", but there does not seem to be a way to cancel indexing e.g in case it takes too long on a huge repository.

It would be really nice to be able to cancel indexing at any time, without interrupting the user flow.

Finish SBT setup

  • Repair travis (change travis.yml)
  • Review settings & tasks
  • Liquibase

SBT config from this could be useful

After release fixes....

  • SQLite patches. Well, it's unlikely that DB schema will change now, but...
  • Figure out how to handle some events like font size change and etc
  • Mb some performance improvements, now 1 commit processing takes 0.4 sec avg.
  • Support for dark theme

Dark theme support

Currently only light IntelliJ theme is supported and histograms look ugly when dark mode is turned on.
This could be solved by replacing hardcoded color values with IntelliJ theme color values in topias/src/main/java/editor/LabelRenderer.java. However, be careful, there is a lot of shitty bad code in there

todo

  • Change history parsing scheme, because methods could be moved or renamed and changes must be matched by full method name, not by reference
  • Change state scheme (remove PsiElement pointer, because it seems to be not needed)
  • Integrate with RefactoringMiner

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.