コード例 #1
0
    def get_results(self):
        print("***************************************" + self.repo +
              "*************************************")
        analysis_manager = AnalysisManager(self, self.repo, self.output_dir,
                                           self.threshold, self.jar_file)

        if self.get_files:
            print("Converting to XML ...")
            analysis_manager.load_files_from_repo()
            analysis_manager.convert_to_xml()
            print("Getting commits ...")
            analysis_manager.get_git_commits()

        analysis_manager.load_files_from_repo()
        analysis_manager.set_xml_files_list(self.repo + "/~Temp/")
        print("Processing data ...")
        analysis_manager.process_data()
コード例 #2
0
class Dialog(QMainWindow):
    def __init__(self, app, exePath=None, parent=None):
        super(QMainWindow, self).__init__(parent)
        self.accepted_suffix = ['cpp', 'h', 'cc', 'c++', 'java', 'cs']
        self.repo_list = [
            "E:\\faculta\\Master\\TestProjects\\bluecove",
            "E:\\faculta\\Master\\TestProjects\\aima-java",
            "E:\\faculta\\Master\\TestProjects\\powermock",
            "E:\\faculta\\Master\\TestProjects\\restfb",
            "E:\\faculta\\Master\\TestProjects\\RxJava",
            "E:\\faculta\\Master\\TestProjects\\metro-jax-ws",
            "E:\\faculta\\Master\\TestProjects\\mockito",
            "E:\\faculta\\Master\\TestProjects\\grizzly",
            "E:\\faculta\\Master\\TestProjects\\shipkit",
            "E:\\faculta\\Master\\TestProjects\\OpenClinica",
            "E:\\faculta\\Master\\TestProjects\\robolectric",
            "E:\\faculta\\Master\\TestProjects\\aeron",
            "E:\\faculta\\Master\\TestProjects\\antlr4",
            "E:\\faculta\\Master\\TestProjects\\mcidasv",
            "E:\\faculta\\Master\\TestProjects\\ShareX",
            "E:\\faculta\\Master\\TestProjects\\aspnetboilerplate",
            "E:\\faculta\\Master\\TestProjects\\orleans",
            "E:\\faculta\\Master\\TestProjects\\cli",
            "E:\\faculta\\Master\\TestProjects\\cake",
            "E:\\faculta\\Master\\TestProjects\\Avalonia",
            "E:\\faculta\\Master\\TestProjects\\EntityFrameworkCore",
            "E:\\faculta\\Master\\TestProjects\\jellyfin",
            "E:\\faculta\\Master\\TestProjects\\PowerShell",
            "E:\\faculta\\Master\\TestProjects\\WeiXinMPSDK",
            "E:\\faculta\\Master\\TestProjects\\ArchiSteamFarm",
            "E:\\faculta\\Master\\TestProjects\\VisualStudio",
            "E:\\faculta\\Master\\TestProjects\\CppSharp"
        ]

        self.setWindowFlags(QtCore.Qt.FramelessWindowHint)
        self.setAutoFillBackground(True)
        self.resize(900, 700)
        self.setStyleSheet("""MainWindow { border-radius: 5px; }""")

        self.app = app
        self.analysisManager = None
        self.show()
        self.maxNormal = False

        self.main_widget = QWidget(self)
        self.main_layout = QVBoxLayout(self.main_widget)

        self.titleBar = TitleBar(self)
        self.setMenuBar(self.titleBar)

        self.model = CheckableDirModel()
        self.tree = QTreeView()

        self.tree.setModel(self.model)

        self.tree.resize(640, 480)
        self.tree.hideColumn(1)
        self.tree.hideColumn(2)
        self.tree.hideColumn(3)
        self.tree.setHeaderHidden(True)
        self.tree.setStyleSheet(
            "QTreeView { background-color: transparent; } ")

        # Creating a progress bar and setting the value limits
        self.progressBar = QProgressBar(self)
        self.progressBar.setMaximum(100)
        self.progressBar.setMinimum(0)

        self.progressLine = QLabel()
        self.progressLine.setStyleSheet(
            "QLineEdit { background-color: transparent; } ")
        # Creating a Horizontal Layout to add all the widgets
        self.boxLayout = QVBoxLayout(self)

        # Adding the widgets
        self.boxLayout.addWidget(self.tree)
        self.boxLayout.addWidget(self.progressLine)
        self.boxLayout.addWidget(self.progressBar)

        self.main_layout.addLayout(self.boxLayout)

        self.main_widget.setLayout(self.main_layout)
        self.setCentralWidget(self.main_widget)

        self.build_tool_bar()

        self.titleBar.minimizeWindow.connect(self.minimize_window_slot)
        self.titleBar.maximizeWindow.connect(self.maximize_window_slot)
        self.titleBar.closeWindow.connect(self.close_window_slot)

    def build_tool_bar(self):
        self.toolbar = QToolBar()
        self.addToolBar(QtCore.Qt.LeftToolBarArea, self.toolbar)

        load_action = QAction(QtGui.QIcon('resources/installed.png'),
                              'Load Files', self)
        process_action = QAction(QtGui.QIcon('resources/run.png'),
                                 'Process Files', self)
        xml_load_action = QAction(QtGui.QIcon('resources/load.png'),
                                  'XML File', self)

        process_action.triggered.connect(self.process_files_clicked)
        xml_load_action.triggered.connect(self.load_xml_clicked)
        load_action.triggered.connect(self.load_files_clicked)

        self.toolbar.addAction(load_action)
        self.toolbar.addAction(process_action)
        self.toolbar.addAction(xml_load_action)

        self.toolbar.setIconSize(QtCore.QSize(65, 65))

        self.toolbar.setFocus()

        self.toolbar.setToolButtonStyle(QtCore.Qt.ToolButtonTextBesideIcon
                                        | QtCore.Qt.LeftToolBarArea)

        self.toolbar.setStyleSheet("""QToolBar {
                     background-color: rgba(155, 155, 144, 100); }""")

        for action in self.toolbar.actions():
            widget = self.toolbar.widgetForAction(action)
            widget.setFixedSize(70, 70)

    def mousePressEvent(self, event):
        self.offset = event.pos()

    def mouseMoveEvent(self, event):
        x = event.globalX()
        y = event.globalY()
        x_w = self.offset.x()
        y_w = self.offset.y()
        self.move(x - x_w, y - y_w)

    def paintEvent(self, event):
        palette = QtGui.QPalette()
        palette.setBrush(
            QtGui.QPalette.Background,
            QtGui.QBrush(
                QtGui.QPixmap("resources/theme.png").scaled(self.size())))
        self.setPalette(palette)

    @QtCore.pyqtSlot()
    def close_window_slot(self):
        self.deleteLater()

    @QtCore.pyqtSlot()
    def minimize_window_slot(self):
        self.showMinimized()

    @QtCore.pyqtSlot()
    def maximize_window_slot(self):
        if self.maxNormal:
            self.resize(800, 600)
            self.maxNormal = False
            self.titleBar.maximize.setIcon(
                QtGui.QIcon('resources/maximize.png'))
            frame_gm = self.frameGeometry()
            center_point = QDesktopWidget().availableGeometry().center()
            frame_gm.moveCenter(center_point)
            self.move(frame_gm.topLeft())

        else:
            screen = QDesktopWidget().screenGeometry()
            self.setGeometry(0, 0, screen.width(), screen.height() - 30)
            self.maxNormal = True
            self.titleBar.maximize.setIcon(
                QtGui.QIcon('resources/unmaximize.png'))

    def clear_layout(self, layout):
        for i in reversed(range(layout.count())):
            layout.itemAt(i).widget().setParent(None)

    def settings_clicked(self):
        self.clear_layout(self.main_layout)

    def load_xml_clicked(self):
        xml_file = str(QFileDialog.getOpenFileName(self, "Select XML File")[0])

        self.progressBar.setValue(0)
        self.print_line("Loading data from XML structure. Please wait ...\n")
        self.progressBar.update()
        xml_dir = os.path.dirname(xml_file)
        self.analysisManager = AnalysisManager(self, xml_dir)
        self.analysisManager.load_structure_from_xml(xml_file)
        self.progressBar.setValue(100)
        self.progressBar.update()

    def load_files_clicked(self):
        file_names = self.model.export_checked()
        repo_dir = self.model.rootDir
        self.analysisManager = AnalysisManager(self, repo_dir)
        self.analysisManager.set_files_list(file_names)
        self.print_line("Files loaded:\n")
        total = len(file_names)
        count = 1
        self.progressBar.setValue(0)
        self.progressBar.update()
        for file in file_names:
            self.print_line(file + "\n")
            self.progressBar.setValue((count * 100) / total)
            self.progressBar.update()
            count += 1

        self.print_line("Total number of files loaded : {}".format(total))

    def print_line(self, text):
        self.app.processEvents()
        self.progressLine.setText(text)

    def change_layout(self):
        self.clear_layout(self.main_layout)

        self.main_widget.setLayout(self.main_layout)
        self.toolbar.setEnabled(True)

    def process_files_clicked(self):
        self.get_res()

    '''
    This method is usually called for the entire process of converting to xml, saving git diff files and counting
    logical and structural dependencies for a selected repo from UI.
    '''

    def process_files(self):
        self.print_line("Converting to XML .......")
        self.analysisManager.convert_to_xml()
        self.analysisManager.set_xml_files_list(self.model.rootDir + "/~Temp/")
        self.print_line("Getting commits .......")
        self.analysisManager.get_git_commits()
        self.print_line("Processing data .......")
        self.analysisManager.process_data()

    '''
        This method is usually called for getting git commits statistics for all the repos that I have.
        Nr of git commits with less than 5, 10, 20, inf files changed. And average per repo.
    '''

    def get_commits_statistic(self):
        for repo in self.repo_list:
            print(
                "______________________________________________________________________________________"
            )
            print(repo)
            repo = repo + "\\~diffs"
            sum_commits = 0
            nr_commits = 0
            commits_under_5 = 0
            commits_under_10 = 0
            commits_under_20 = 0
            commits_above_20 = 0
            for file in os.listdir(repo):
                nr_commits += 1
                file = file.replace('.txt', '')
                nr_of_commits_str = file.split('FilesChanged_')[1]
                commit_size = int(nr_of_commits_str)
                if commit_size <= 5:
                    commits_under_5 += 1
                elif commit_size <= 10:
                    commits_under_10 += 1
                elif commit_size <= 20:
                    commits_under_20 += 1
                else:
                    commits_above_20 += 1
                sum_commits += commit_size

            print(
                str(commits_under_5) + "," + str(commits_under_10) + "," +
                str(commits_under_20) + "," + str(commits_above_20) + "," +
                str(sum_commits / nr_commits))

    def get_res(self):
        for repo in self.repo_list:
            print(
                "______________________________________________________________________________________"
            )
            print(repo)
            self.analysisManager = AnalysisManager(self, repo)
            self.analysisManager.set_xml_files_list(repo + "/~Temp/")
            self.analysisManager.process_data()