Skip to content

Commit

Permalink
feat: Updating git on changes in directory (file watcher)
Browse files Browse the repository at this point in the history
  • Loading branch information
tomlin7 committed Apr 11, 2024
1 parent 28b627e commit 10f34f1
Show file tree
Hide file tree
Showing 6 changed files with 83 additions and 19 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ def __init__(self, master, startpath=None, observe_changes=False, itembar=True,
self.nodes = {}

self.ignore_dirs = [".git", "__pycache__", ".pytest_cache", "node_modules", "debug", "dist", "build"]
self.ignore_dir_patterns = ["*/.git/*", "*/__pycache__/*", "*/.pytest_cache/*", "*/node_modules/*", "*/debug/*", "*/dist/*", "*/build/*"]
self.ignore_exts = [".pyc"]

self.tree = Tree(self.content, startpath, doubleclick=self.openfile, singleclick=self.preview_file, *args, **kwargs)
Expand Down
29 changes: 24 additions & 5 deletions biscuit/core/components/views/sidebar/explorer/watcher.py
Original file line number Diff line number Diff line change
@@ -1,16 +1,26 @@
from __future__ import annotations

import typing

if typing.TYPE_CHECKING:
from .directorytree import DirectoryTree

import os

import watchdog.events
from watchdog.events import FileSystemEventHandler
from watchdog.events import PatternMatchingEventHandler
from watchdog.observers import Observer


class DirectoryTreeWatcher(FileSystemEventHandler):
def __init__(self, master, tree, observe_changes) -> None:
class DirectoryTreeWatcher(PatternMatchingEventHandler):
def __init__(self, master: DirectoryTree, tree, observe_changes) -> None:
self.master = master
self.base = master.base
self.tree = tree
self.observe_changes = observe_changes

super().__init__(ignore_patterns=self.master.ignore_dir_patterns)

self.observer = Observer()
self.observer.start()

Expand All @@ -24,15 +34,24 @@ def stop_watch(self) -> None:

def on_created(self, event) -> None:
self.master.update_path(os.path.dirname(event.src_path))
self.base.source_control.reload_tree()
print('created', event.src_path)

def on_deleted(self, event) -> None:
self.master.update_path(os.path.dirname(event.src_path))
self.base.source_control.reload_tree()
print('deleted', event.src_path)

def on_modified(self, event) -> None: ...
def on_modified(self, event) -> None:
# self.master.update_path(os.path.dirname(event.src_path))

# self.base.source_control.reload_tree()
# print('modified', event.src_path)
...

def on_moved(self, event):
try:
self.master.update_path(os.path.dirname(event.src_path))
self.base.source_control.reload_tree()
print('moved', event.src_path, event.dest_path)
except FileNotFoundError:
pass
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@

class SourceControl(SidebarView):
def __init__(self, master, *args, **kwargs) -> None:
self.__buttons__ = [('list-tree',), ('check',), ('refresh', self.refresh)]
super().__init__(master, *args, **kwargs)
self.__icon__ = 'source-control'
self.name = 'Source Control'
Expand All @@ -20,6 +19,7 @@ def __init__(self, master, *args, **kwargs) -> None:
self.menu.add_checkable("Show Staged", self.tree.toggle_staged)
self.menu.add_separator(10)
self.menu.add_checkable("Show Changes", self.tree.toggle_changes)
self.add_button('refresh', self.refresh)
self.add_button('ellipsis', self.menu.show)

def reload_tree(self, *_) -> None:
Expand Down
13 changes: 11 additions & 2 deletions biscuit/core/components/views/sidebar/sourcecontrol/changes.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

class Changes(SidebarViewItem):
def __init__(self, master, *args, **kwargs) -> None:
self.__buttons__ = (('discard',), ('add', self.git_add_all))
self.__buttons__ = (('discard', self.git_discard_all), ('add', self.git_add_all))
self.title = "Changes"
super().__init__(master, *args, **kwargs)
self.config(**self.base.theme.views.sidebar.item)
Expand All @@ -29,8 +29,17 @@ def clear_tree(self, *_) -> None:

self.items.clear()

def clear(self, otherthan: list=[]) -> None:
if not otherthan:
return self.clear_tree()

for path, val in list(self.items.items()):
if (path, val[1]) not in otherthan:
self.items[path][0].destroy()
del self.items[path]

def add_item(self, path, kind) -> None:
if path in self.items:
if path in self.items and self.items[path][1] == kind:
return

new_item = ChangeItem(self.content, path, kind)
Expand Down
48 changes: 37 additions & 11 deletions biscuit/core/components/views/sidebar/sourcecontrol/git.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,22 +45,48 @@ def add_changes(self, changed_files=(), kind=0) -> None:
self.changes_tree.refresh()

def open_repo(self) -> None:
self.staged_changes_tree.clear_tree()
self.changes_tree.clear_tree()
# self.staged_changes_tree.clear_tree()
# self.changes_tree.clear_tree()
# self.set_title(f"{os.path.basename(self.base.active_directory)}({self.base.git.active_branch})")

if not self.base.git.repo:
return

self.add_staged_changes(self.base.git.repo.get_staged_deleted_files(), 0)
self.add_staged_changes(self.base.git.repo.get_staged_added_files(), 1)
self.add_staged_changes(self.base.git.repo.get_staged_modified_files(), 2)

self.add_changes(self.base.git.repo.get_deleted_files(), 0)
self.add_changes(self.base.git.repo.get_added_files(), 1)
self.add_changes(self.base.git.repo.get_modified_files(), 2)
self.add_changes(self.base.git.repo.get_untracked_files(), 3)

staged = []

if deleted := self.base.git.repo.get_staged_deleted_files():
self.add_staged_changes(deleted, 0)
staged += deleted
if added := self.base.git.repo.get_staged_added_files():
self.add_staged_changes(added, 1)
staged += added
if modified := self.base.git.repo.get_staged_modified_files():
self.add_staged_changes(modified, 2)
staged += modified

if staged:
self.staged_changes_tree.clear(otherthan=staged)

unstaged = []

if deleted := self.base.git.repo.get_deleted_files():
self.add_changes(deleted, 0)
unstaged += [(i, 0) for i in deleted]
if added := self.base.git.repo.get_added_files():
self.add_changes(added, 1)
unstaged += [(i, 1) for i in added]
if modified := self.base.git.repo.get_modified_files():
self.add_changes(modified, 2)
unstaged += [(i, 2) for i in modified]

# untracked files
if untracked := self.base.git.repo.get_untracked_files():
self.add_changes(untracked, 3)
unstaged += [(i, 3) for i in untracked]

if unstaged:
self.changes_tree.clear(otherthan=unstaged)

def toggle_staged(self, *_) -> None:
if not self.base.git_found:
return
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,15 @@ def clear_tree(self, *_) -> None:
pass

self.items.clear()

def clear(self, otherthan: list=[]) -> None:
if not otherthan:
return self.clear_tree()

for path in list(self.items.keys()):
if path not in otherthan:
self.items[path].destroy()
del self.items[path]

def add_item(self, path, kind) -> None:
if path in self.items:
Expand Down

0 comments on commit 10f34f1

Please sign in to comment.