示例#1
0
    def _init_repository(self):

        # Fixme: code place

        self._logger.info('Init Repository')

        if self._args.path is None:
            path = os.getcwd()
        else:
            path = self._args.path
        try:
            self._repository = GitRepository(path)
        except RepositoryNotFound:
            self.show_message(
                "Any Git repository was found in path {}".format(path),
                warn=True)
            self._repository = None
            return

        review_path = self._repository.workdir.joinpath('review.json')
        self._review = Review(review_path)

        branch_name = self._repository.branch_name
        branch_name = branch_name.replace('refs/heads/', ' refs/heads/   ')
        self._main_window._branch_name.setText(
            'Branch:   {}'.format(branch_name))

        self._log_table_model = LogTableModel(self._repository)
        self._log_table_filter = LogTableFilterProxyModel()
        self._log_table_filter.setSourceModel(self._log_table_model)
        # self._log_table_filter.???.connect(self._main_window._on_log_table_filter_changed)
        self._main_window._on_log_table_filter_changed()
        log_table = self._main_window._log_table
        # log_table.setModel(self._log_table_model)
        log_table.setModel(self._log_table_filter)
        # Set the column widths
        column_enum = self._log_table_model.COLUMN_ENUM
        width = 0
        for column in (
                column_enum.revision,
                # column_enum.message,
                column_enum.date,
                column_enum.committer,
        ):
            log_table.resizeColumnToContents(int(column))
            width += log_table.columnWidth(int(column))
        width = log_table.width() - width
        width *= .9  # Fixme: subtract spaces ...
        log_table.setColumnWidth(int(column_enum.message), width)

        self._commit_table_model = CommitTableModel()
        commit_table = self._main_window._commit_table
        commit_table.setModel(self._commit_table_model)

        self._main_window.finish_table_connections()
示例#2
0
    def __init__(self, path=None):

        super().__init__()

        self._logger.info('Init Repository')

        if path is None:
            path = os.getcwd()
        try:
            self._repository = GitRepository(path)
        except RepositoryNotFound:
            raise NameError(
                "Any Git repository was found in path {}".format(path))
            self._repository = None
            return

        self._branches = []
        self._update_branches()

        self._commit_pool = QmlCommitPool(self)
        self._commits = []
        self._update_commits()

        self._tags = []
        self._update_tags()
示例#3
0
    def _init_repository(self):

        if self._args.path is None:
            path = os.getcwd()
        else:
            path = self._args.path
        try:
            self._repository = GitRepository(path)
        except RepositoryNotFound:
            self.show_message("Any Git repository was found in path {}".format(path), warn=True)
            self._repository = None
            return

        self._log_table_model = LogTableModel(self._repository)
        log_table = self._main_window._log_table
        log_table.setModel(self._log_table_model)
        # Set the column widths
        column_enum = self._log_table_model.column_enum
        width = 0
        for column in (
            column_enum.revision,
            # column_enum.message,
            column_enum.date,
            column_enum.comitter,
        ):
            log_table.resizeColumnToContents(int(column))
            width += log_table.columnWidth(int(column))
        width = log_table.width() - width
        width *= .9 # Fixme: subtract spaces ...
        log_table.setColumnWidth(int(column_enum.message), width)
        
        self._commit_table_model = CommitTableModel()
        commit_table = self._main_window._commit_table
        commit_table.setModel(self._commit_table_model)
    def _init_repository(self):

        self._logger.info('Init Repository')

        if self._args.path is None:
            path = os.getcwd()
        else:
            path = self._args.path
        try:
            self._repository = GitRepository(path)
        except RepositoryNotFound:
            self.show_message("Any Git repository was found in path {}".format(path), warn=True)
            self._repository = None
            return

        self._log_table_model = LogTableModel(self._repository)
        log_table = self._main_window._log_table
        log_table.setModel(self._log_table_model)
        # Set the column widths
        column_enum = self._log_table_model.column_enum
        width = 0
        for column in (
            column_enum.revision,
            # column_enum.message,
            column_enum.date,
            column_enum.comitter,
        ):
            log_table.resizeColumnToContents(int(column))
            width += log_table.columnWidth(int(column))
        width = log_table.width() - width
        width *= .9 # Fixme: subtract spaces ...
        log_table.setColumnWidth(int(column_enum.message), width)

        self._commit_table_model = CommitTableModel()
        commit_table = self._main_window._commit_table
        commit_table.setModel(self._commit_table_model)

        self._main_window.finish_table_connections()
class LogBrowserApplication(GuiApplicationBase, ApplicationBase):

    _logger = logging.getLogger(__name__)

    directory_changed = QtCore.pyqtSignal(str)
    file_changed = QtCore.pyqtSignal(str)

    ###############################################

    def __init__(self, args):

        super(LogBrowserApplication, self).__init__(args=args)
        self._logger.debug(str(args))

        from .LogBrowserMainWindow import LogBrowserMainWindow
        self._main_window = LogBrowserMainWindow()
        self._main_window.showMaximized()

        self.post_init()

    ##############################################

    def _init_actions(self):
        super(LogBrowserApplication, self)._init_actions()

    ##############################################

    def post_init(self):

        super(LogBrowserApplication, self).post_init()
        self._init_repository()
        self._init_file_system_watcher()
        self._main_window.show_working_tree_diff()

        self._main_window._diff_a.setText(self._args.diff_a)
        self._main_window._diff_b.setText(self._args.diff_b)
        self._main_window._on_diff_ab()

    ##############################################

    def show_message(self, message=None, timeout=0, warn=False):

        """ Hides the normal status indications and displays the given message for the specified
        number of milli-seconds (timeout). If timeout is 0 (default), the message remains displayed
        until the clearMessage() slot is called or until the showMessage() slot is called again to
        change the message.

        Note that showMessage() is called to show temporary explanations of tool tip texts, so
        passing a timeout of 0 is not sufficient to display a permanent message.
        """

        self._main_window.show_message(message, timeout, warn)

    ##############################################

    def _init_repository(self):

        # Fixme: code place

        self._logger.info('Init Repository')

        if self._args.path is None:
            path = os.getcwd()
        else:
            path = self._args.path
        try:
            self._repository = GitRepository(path)
        except RepositoryNotFound:
            self.show_message("Any Git repository was found in path {}".format(path), warn=True)
            self._repository = None
            return

        review_path = self._repository.workdir.joinpath('review.json')
        self._review = Review(review_path)

        branch_name = self._repository.branch_name
        branch_name = branch_name.replace('refs/heads/', ' refs/heads/   ')
        self._main_window._branch_name.setText('Branch:   {}'.format(branch_name))

        self._log_table_model = LogTableModel(self._repository)
        self._log_table_filter = LogTableFilterProxyModel()
        self._log_table_filter.setSourceModel(self._log_table_model)
        # self._log_table_filter.???.connect(self._main_window._on_log_table_filter_changed)
        self._main_window._on_log_table_filter_changed()
        log_table = self._main_window._log_table
        # log_table.setModel(self._log_table_model)
        log_table.setModel(self._log_table_filter)
        # Set the column widths
        column_enum = self._log_table_model.COLUMN_ENUM
        width = 0
        for column in (
            column_enum.revision,
            # column_enum.message,
            column_enum.date,
            column_enum.committer,
        ):
            log_table.resizeColumnToContents(int(column))
            width += log_table.columnWidth(int(column))
        width = log_table.width() - width
        width *= .9 # Fixme: subtract spaces ...
        log_table.setColumnWidth(int(column_enum.message), width)

        self._commit_table_model = CommitTableModel()
        commit_table = self._main_window._commit_table
        commit_table.setModel(self._commit_table_model)

        self._main_window.finish_table_connections()

    ##############################################

    def reload_repository(self):
        self._init_repository()

    ##############################################

    @property
    def repository(self):
        return self._repository

    @property
    def log_table_model(self):
        return self._log_table_model

    @property
    def log_table_filter(self):
        return self._log_table_filter

    @property
    def review(self):
        return self._review

    ##############################################

    def _init_file_system_watcher(self):

        self._logger.info("Monitor {}".format(self._repository.workdir))

        self._file_system_watcher = QtCore.QFileSystemWatcher()
        self._setup_file_system_watcher()

        # Update registrations
        #!# self._file_system_watcher.directoryChanged.connect(self._setup_file_system_watcher)

        # Attention: a git command generate many successive events
        self._file_system_watcher.directoryChanged.connect(self.directory_changed)
        self._file_system_watcher.fileChanged.connect(self.file_changed)

    ##############################################

    def _setup_file_system_watcher(self):

        self._logger.info('')

        # Fixme: optimise for large repositories ?

        # Clear
        #! self.unwatch_directories() #! remove monitored files as well !
        #! self.unwatch_files()
        # Fixme: removed path ???

        # Only monitor directories
        self.watch_directories()
        self.watch(self._repository.REFS_PATH) # monitor commit (directory)

        self.watch(self._repository.INDEX_PATH) # monitor stage (file)

    ##############################################

    def watch_directories(self):

        paths = []
        git_path = str(self._repository.join_repository_path('.git'))
        for root, _, _ in os.walk(self._repository.workdir):
            if not root.startswith(git_path):
                paths.append(root)
        # self._logger.info('watch {}'.format(paths))
        self._file_system_watcher.addPaths(paths)

    ##############################################

    def watch(self, path):
        absolut_path = str(self._repository.join_repository_path(path))
        self._logger.info(absolut_path)
        self._file_system_watcher.addPath(absolut_path)

    ##############################################

    def unwatch(self, path):
        absolut_path = str(self._repository.join_repository_path(path))
        self._logger.info(absolut_path)
        self._file_system_watcher.removePath(absolut_path)

    ##############################################

    def _unwatch_paths(self, paths):
        # Fixme: code ???
        if paths:
            self._file_system_watcher.removePaths(paths)

    ##############################################

    def unwatch_directories(self):
        self._unwatch_paths(self._file_system_watcher.directories())

    ##############################################

    def unwatch_files(self):
        self._unwatch_paths(self._file_system_watcher.files())
class LogBrowserApplication(GuiApplicationBase, ApplicationBase):

    _logger = logging.getLogger(__name__)

    directory_changed = QtCore.pyqtSignal(str)
    file_changed = QtCore.pyqtSignal(str)

    ###############################################

    def __init__(self, args):

        super(LogBrowserApplication, self).__init__(args=args)
        self._logger.debug(str(args))

        from .LogBrowserMainWindow import LogBrowserMainWindow
        self._main_window = LogBrowserMainWindow()
        self._main_window.showMaximized()

        self.post_init()

    ##############################################

    def _init_actions(self):

        super(LogBrowserApplication, self)._init_actions()

    ##############################################

    def post_init(self):

        super(LogBrowserApplication, self).post_init()
        self._init_repository()
        self._init_file_system_watcher()
        self._main_window.show_working_tree_diff()

    ##############################################

    def show_message(self, message=None, timeout=0, warn=False):

        """ Hides the normal status indications and displays the given message for the specified
        number of milli-seconds (timeout). If timeout is 0 (default), the message remains displayed
        until the clearMessage() slot is called or until the showMessage() slot is called again to
        change the message.

        Note that showMessage() is called to show temporary explanations of tool tip texts, so
        passing a timeout of 0 is not sufficient to display a permanent message.
        """

        self._main_window.show_message(message, timeout, warn)

    ##############################################

    def _init_repository(self):

        self._logger.info('Init Repository')

        if self._args.path is None:
            path = os.getcwd()
        else:
            path = self._args.path
        try:
            self._repository = GitRepository(path)
        except RepositoryNotFound:
            self.show_message("Any Git repository was found in path {}".format(path), warn=True)
            self._repository = None
            return

        self._log_table_model = LogTableModel(self._repository)
        log_table = self._main_window._log_table
        log_table.setModel(self._log_table_model)
        # Set the column widths
        column_enum = self._log_table_model.column_enum
        width = 0
        for column in (
            column_enum.revision,
            # column_enum.message,
            column_enum.date,
            column_enum.comitter,
        ):
            log_table.resizeColumnToContents(int(column))
            width += log_table.columnWidth(int(column))
        width = log_table.width() - width
        width *= .9 # Fixme: subtract spaces ...
        log_table.setColumnWidth(int(column_enum.message), width)

        self._commit_table_model = CommitTableModel()
        commit_table = self._main_window._commit_table
        commit_table.setModel(self._commit_table_model)

        self._main_window.finish_table_connections()

    ##############################################

    def reload_repository(self):
        self._init_repository()

    ##############################################

    @property
    def repository(self):
        return self._repository

    ##############################################

    def _init_file_system_watcher(self):

        self._logger.info("Monitor {}".format(self._repository.workdir))

        self._file_system_watcher = QtCore.QFileSystemWatcher()
        self._setup_file_system_watcher()

        # Update registrations
        #!# self._file_system_watcher.directoryChanged.connect(self._setup_file_system_watcher)

        # Attention: a git command generate many successive events
        self._file_system_watcher.directoryChanged.connect(self.directory_changed)
        self._file_system_watcher.fileChanged.connect(self.file_changed)

    ##############################################

    def _setup_file_system_watcher(self):

        self._logger.info('')

        # Fixme: optimise for large repositories ?

        # Clear
        #! self.unwatch_directories() #! remove monitored files as well !
        #! self.unwatch_files()
        # Fixme: removed path ???

        # Only monitor directories
        self.watch_directories()
        self.watch(self._repository.REFS_PATH) # monitor commit (directory)

        self.watch(self._repository.INDEX_PATH) # monitor stage (file)

    ##############################################

    def watch_directories(self):

        paths = []
        git_path = self._repository.join_repository_path('.git')
        for root, _, _ in os.walk(self._repository.workdir):
            if not root.startswith(git_path):
                paths.append(root)
        self._logger.info('watch {}'.format(paths))
        self._file_system_watcher.addPaths(paths)

    ##############################################

    def watch(self, path):

        absolut_path = self._repository.join_repository_path(path)
        self._logger.info(absolut_path)
        self._file_system_watcher.addPath(absolut_path)

    ##############################################

    def unwatch(self, path):

        absolut_path = self._repository.join_repository_path(path)
        self._logger.info(absolut_path)
        self._file_system_watcher.removePath(absolut_path)

    ##############################################

    def _unwatch_paths(self, paths):

        # Fixme: code ???
        if paths:
            self._file_system_watcher.removePaths(paths)

    ##############################################

    def unwatch_directories(self):

        self._unwatch_paths(self._file_system_watcher.directories())

    ##############################################

    def unwatch_files(self):

        self._unwatch_paths(self._file_system_watcher.files())