def __init__(self, args): self.repo = None self.win = EgituWin(self) self.win.populate() # setup keyboard shortcuts binds = KeyBindings(self.win, verbose=False) binds.bind_add('F1', self.action_about) binds.bind_add(('Control+r', 'F5'), self.action_reload_repo) binds.bind_add('Control+o', self.action_open) binds.bind_add('Control+q', self.action_quit) binds.bind_add('Control+b', self.action_branches) binds.bind_add('Control+p', self.action_pull) binds.bind_add('Control+Shift+p', self.action_push) binds.bind_add('Control+c', self.action_clone) binds.bind_add('Control+t', self.action_tags) binds.bind_add('Control+s', self.action_stash_save) binds.bind_add('Control+Shift+s', self.action_stash_show) binds.bind_add('Control+m', self.action_compare) # try to load a repo, from command-line or cwd (else show the RepoSelector) if not self.try_to_load(os.path.abspath(args[0]) if args else os.getcwd()): RepoSelector(self)
class EgituApp(object): def __init__(self, args): self.repo = None self.win = EgituWin(self) self.win.populate() # setup keyboard shortcuts binds = KeyBindings(self.win, verbose=False) binds.bind_add('F1', self.action_about) binds.bind_add(('Control+r', 'F5'), self.action_reload_repo) binds.bind_add('Control+o', self.action_open) binds.bind_add('Control+q', self.action_quit) binds.bind_add('Control+b', self.action_branches) binds.bind_add('Control+p', self.action_pull) binds.bind_add('Control+Shift+p', self.action_push) binds.bind_add('Control+c', self.action_clone) binds.bind_add('Control+t', self.action_tags) binds.bind_add('Control+s', self.action_stash_save) binds.bind_add('Control+Shift+s', self.action_stash_show) binds.bind_add('Control+m', self.action_compare) # try to load a repo, from command-line or cwd (else show the RepoSelector) if not self.try_to_load(os.path.abspath(args[0]) if args else os.getcwd()): RepoSelector(self) # generic actions def action_quit(self, *args): elm.exit() def action_about(self, *args): AboutWin(self.win) # repo actions def action_open(self, *args): RepoSelector(self) def try_to_load(self, path): repo = repo_factory(path) if repo: repo.load_from_url(path, self._load_done_cb, repo) return True else: return False def _load_done_cb(self, success, repo): if success is True: # save to recent history recent_history_push(repo.url) # show the new loaded repo self.repo = repo self.action_update_header() self.action_clear_sidebar() if repo.status.is_clean: self.action_show_ref('HEAD') else: self.action_show_local_status() else: RepoSelector(self) def checkout_ref(self, ref): self.repo.checkout(self._checkout_done_cb, ref) def _checkout_done_cb(self, success, err_msg=None): if success: self.action_update_all() else: ErrorPopup(self.win, 'Operation Failed', utf8_to_markup(err_msg)) def action_reload_repo(self, *args): if self.repo is not None: self.repo.refresh(self._reload_done_cb) def _reload_done_cb(self, success, err_msg=None): self.action_update_all() # gui update utils def action_update_all(self, *args): self.win.update_header() self.win.sidebar.update() self.win.graph.update() def action_update_dag(self, *args): self.win.graph.update() def action_update_header(self, *args): self.win.update_header() def action_update_diffview(self, *args): self.win.diff_view.refresh_diff() def action_clear_sidebar(self, *args): self.win.sidebar.populate() def action_show_commit(self, commit): self.win.diff_view.show_commit(commit) self.win.sidebar.unselect_local() def action_show_local_status(self): self.win.sidebar.select_local() self.win.graph.populate('HEAD') self.win.diff_view.show_local_status() def action_show_full_history(self): self.win.graph.populate(hilight_ref='HEAD') def action_show_branch(self, branch): self.win.graph.populate(branch.name, hilight_ref=branch.name) def action_show_tag(self, tag): self.win.graph.populate(tag.ref, hilight_ref=tag.name) def action_show_ref(self, ref): self.win.graph.populate(ref, hilight_ref=ref) # branch actions def action_branches(self, *args): if self.repo is not None: BranchesDialog(self) def action_branch_delete(self, branch): DeleteBranchPopup(self.win, self, branch) def action_branch_merge(self, branch): MergeBranchPopup(self.win, self, branch) # compare actions def action_compare(self, *args, **kargs): if self.repo is not None: CompareDialog(self.win, self, **kargs) # tag actions def action_tags(self, *args): if self.repo is not None: TagsDialog(self.win, self) def action_tag_delete(self, tag): def _done_cb(success, err_msg=None): if success: self.action_update_all() else: ErrorPopup(self.win, 'Delete Failed', utf8_to_markup(err_msg)) self.repo.tag_delete(_done_cb, tag.name) # remote actions def action_remotes(self, *args): if self.repo is not None: RemotesDialog(self) def action_pull(self, *args): if self.repo is not None: PullPopup(self.win, self) def action_push(self, *args): if self.repo is not None: PushPopup(self.win, self) def action_clone(self, *args): ClonePopup(self.win, self) # stash actions def action_stash_save(self, *args): # TODO: check if repo is clean if self.repo is not None: StashSavePopup(self.win, self) def action_stash_show(self, *args): if self.repo is not None: if self.repo.stash: StashDialog(self.win, self) else: ErrorPopup(self.win, 'The stash is empty', 'Nothing to show') def action_stash_show_item(self, stash_item): StashDialog(self.win, self, stash_item) def action_stash_apply(self, stash_item): def _done_cb(success, err_msg=None): if success: self.action_update_all() else: ErrorPopup(self.win, msg=utf8_to_markup(err_msg)) self.repo.stash_apply(_done_cb, stash_item) def action_stash_pop(self, stash_item): def _done_cb(success, err_msg=None): if success: self.action_update_all() else: ErrorPopup(self.win, msg=utf8_to_markup(err_msg)) self.repo.stash_pop(_done_cb, stash_item) def action_stash_branch(self, stash_item): def _confirmed_cb(branch_name): self.repo.stash_branch(_done_cb, stash_item, branch_name) def _done_cb(success, err_msg=None): if success: self.action_update_all() else: ErrorPopup(self.win, msg=utf8_to_markup(err_msg)) RequestPopup(self.win, _confirmed_cb, 'Stash -> branch', 'Pop the stash in a newly created branch', 'Type the name for the new branch', not_empty=True) def action_stash_drop(self, stash_item): def _confirmed_cb(): self.repo.stash_drop(_done_cb, stash_item) def _done_cb(success, err_msg=None): if success: self.action_update_all() else: ErrorPopup(self.win, msg=utf8_to_markup(err_msg)) ConfirmPupup(self.win, ok_cb=_confirmed_cb, msg='This will delete the stash item:<br><br>' \ '<hilight>{0.ref}</hilight><br>' \ '<b>{0.desc}</b>'.format(stash_item))