Guitar
MainWindow.h
Go to the documentation of this file.
1 #ifndef MAINWINDOW_H
2 #define MAINWINDOW_H
3 
4 #include "ApplicationGlobal.h"
5 #include "Git.h"
6 #include "GitCommandRunner.h"
7 #include "MyProcess.h"
8 #include "RepositoryInfo.h"
9 #include "RepositoryModel.h"
10 #include "RepositoryTreeWidget.h"
11 #include "StatusInfo.h"
12 #include "TextEditorTheme.h"
13 #include "UserEvent.h"
14 #include <QMainWindow>
15 #include <memory>
16 
19 class BranchLabel;
20 struct RepositoryInfo;
21 class GitObjectCache;
22 class QListWidget;
23 class QListWidgetItem;
24 class QTableWidgetItem;
25 class QTreeWidgetItem;
27 class ProgressWidget;
28 
29 namespace Ui {
30 class MainWindow;
31 }
32 
33 struct CloneParams {
36 };
37 Q_DECLARE_METATYPE(CloneParams)
38 
39 enum class LogChannel {
40  Default,
41  PTY,
42 };
43 
44 struct LogData {
45  QByteArray data;
46  LogData() = default;
47  LogData(QByteArray const &ba)
48  : data(ba)
49  {
50  }
51  LogData(QString const &s)
52  : data(s.toUtf8())
53  {
54  }
55  LogData(char const *p, int n)
56  : data(p, n)
57  {
58  }
59  LogData(std::string_view const &s)
60  : data(s.data(), s.size())
61  {
62  }
63 };
64 Q_DECLARE_METATYPE(LogData)
65 
68  QString repository_name;
69 };
70 
71 class HunkItem {
72 public:
73  int hunk_number = -1;
74  size_t pos, len;
75  std::vector<std::string> lines;
76 };
77 
78 class AbstractGitCommand;
79 
81 
83 public:
84  std::function<void(ProcessStatus *, QVariant const &)> callback;
85  std::shared_ptr<ProcessStatus> status;
86  QVariant userdata;
87  QString process_name;
88  QElapsedTimer elapsed;
90  : status(std::make_shared<ProcessStatus>())
91  {
92  }
93 };
94 Q_DECLARE_METATYPE(PtyProcessCompleted)
95 
96 class MainWindow : public QMainWindow {
97  Q_OBJECT
98  friend class UserEventHandler;
99  friend class ImageViewWidget;
100  friend class FileDiffSliderWidget;
101  friend class FileHistoryWindow;
102  friend class FileDiffWidget;
103  friend class AboutDialog;
104  friend class RepositoryTreeWidget; // TODO:
106 
107 public:
108  enum {
109  IndexRole = Qt::UserRole,
116  };
120  };
121 
125  };
126 
128  Branches = 0x0001,
129  Tags = 0x0002,
130  Remotes = 0x0100,
131  };
132 
133  enum class FileListType {
134  MessagePanel,
135  SingleList,
136  SideBySide,
137  };
138 
139 private:
140  struct ObjectData {
141  std::string id;
142  std::string path;
145  QString header;
146  size_t idiff;
147  bool staged = false;
148  };
149 
150 private:
151  Ui::MainWindow *ui;
152 
153  struct Private;
155 
157  int row = -1;
158  };
159 
160  enum class FilterTarget {
161  RepositorySearch,
162  CommitLogSearch,
163  };
164 
165  class GitFile {
166  public:
168  QByteArray content;
169  explicit operator bool() const
170  {
171  return type != GitObject::Type::NONE;
172  }
173  bool is(GitObject::Type t) const
174  {
175  return t == type;
176  }
177  };
178 
179  void postEvent(QObject *receiver, QEvent *event, int ms_later);
180  void postUserEvent(UserEventHandler::variant_t &&v, int ms_later);
181  void cancelPendingUserEvents();
182 
183  void updateFileList(const GitHash &id);
184  void updateFileList(const GitCommitItem *commit);
185  void updateFileListLater(int delay_ms);
186  void cancelUpdateFileList();
187  void initUpdateFileListTimer();
188 
190  bool new_session = true;
191 
192  bool validate = false;
193  bool wait_cursor = true;
194  bool keep_selection = false;
195 
196  bool clear_log = true;
197  bool do_fetch = true;
198 
199  bool suppress_uncommit_changes = false;
200  };
201  void openRepositoryMain(OpenRepositoryOption const &opt);
202  void openRepository(OpenRepositoryOption const &opt);
203  void reopenRepository(bool validate, OpenRepositoryOption opt);
204  void reopenRepositoryAsNewSession();
205  void openSelectedRepository();
206 
207  void doReopenRepository(ProcessStatus *status, const RepositoryInfo &repodata);
208 
209  QStringList selectedFiles_(QListWidget *listwidget) const;
210  QStringList selectedFiles() const;
211  void for_each_selected_files(std::function<void(QString const &)> const &fn);
212  void clearFileList();
213  void clearDiffView();
214 
215  RepositoryTreeIndex repositoryTreeIndex(const QTreeWidgetItem *item) const;
216  std::optional<RepositoryInfo> repositoryItem(const RepositoryTreeIndex &index) const;
217 
218  void reflectRepositories();
219 
220  void updateDiffView(QListWidgetItem const *item);
221  void updateDiffView();
222  void updateUnstagedFileCurrentItem();
223  void updateStagedFileCurrentItem();
224  void updateStatusBarText();
225  void setRepositoryInfo(QString const &reponame, QString const &brname);
226 
227  QString getIncrementalSearchText() const;
228  void setIncrementalSearchText(QString const &text, int repo_list_select_row = -1);
229  void clearFilterText(int repo_list_select_row = -1);
230  void clearAllFilters(int select_row = -1);
231  bool applyFilter();
232 public:
233  static QString appendCharToFilterText(QString filter, const QString &add);
234 private:
235  bool appendCharToFilterText(const QString &add, FilterTarget ft);
236  MainWindow::FilterTarget filtertarget() const;
237 
238  void revertCommit();
239  void mergeBranch(QString const &commit, GitMergeFastForward ff, bool squash);
240  void mergeBranch(GitCommitItem const *commit, GitMergeFastForward ff, bool squash);
241  void rebaseBranch(GitCommitItem const *commit);
242  void cherrypick(GitCommitItem const *commit);
243  void merge(GitCommitItem commit = { });
244  void setRemoteOnline(bool f, bool save);
245  void startTimers();
246  void setNetworkingCommandsEnabled(bool enabled);
247 
248  void blame(const QListWidgetItem *item);
249  void blame();
250 
251  QListWidgetItem *currentFileItem() const;
252 
253  void execAreYouSureYouWantToContinueConnectingDialog(QString const &windowtitle);
254  void execConsiderGitRebaseQuitOrWorktreeAddDialog(QString const &windowtitle);
255 
256  void deleteRemoteBranch(const GitCommitItem &commit);
257 
258  struct RemoteBranches {
259  QStringList branches;
260  QStringList all_branches;
261  };
262  RemoteBranches remoteBranches(const GitHash &id);
263 
264  bool isGitInitialized() const;
265  void onLogCurrentItemChanged(bool update_file_list);
266  void findNext();
267  void findText(QString const &text);
268  bool locateCommitID(QString const &commit_id);
269  void showStatus();
270  void onStartEvent();
271  void showLogWindow(bool show);
272  bool isValidRemoteURL(QString const &url, QString const &sshkey);
273  QStringList whichCommand_(QString const &cmdfile1, QString const &cmdfile2 = { });
274  QString selectCommand_(QString const &cmdname, const QStringList &cmdfiles, const QStringList &list, QString path, const std::function<void(QString const &)> &callback);
275  QString selectCommand_(QString const &cmdname, QString const &cmdfile, const QStringList &list, QString const &path, const std::function<void(QString const &)> &callback);
276  const RepositoryInfo *findRegisteredRepository(QString *workdir) const;
277  bool execSetGlobalUserDialog();
278  void revertAllFiles();
279  bool execWelcomeWizardDialog();
280  void execRepositoryPropertyDialog(const RepositoryInfo &repo, bool open_repository_menu = false);
281  void execConfigUserDialog(const GitUser &global_user, const GitUser &local_user, bool enable_local_user, QString const &reponame);
282  void setGitCommand(QString const &path, bool save);
283  void setGpgCommand(QString const &path, bool save);
284  void setSshCommand(QString const &path, bool save);
285  bool checkGitCommand();
286  bool saveByteArrayAs(const QByteArray &ba, QString const &dstpath);
287  QString executableOrEmpty(QString const &path);
288  bool checkExecutable(QString const &path);
289  void internalSaveCommandPath(QString const &path, bool save, QString const &name);
290  void logGitVersion();
291  void internalClearRepositoryInfo();
292  void checkUser();
293 
294  void setCurrentRepository(const RepositoryInfo &repo, bool clear_authentication);
295  std::optional<std::vector<GitDiff>> makeDiffs(GitRunner g, GitHash id, std::future<std::vector<GitSubmoduleItem>> &&async_modules);
296 
297  void updateRemoteInfo();
298 
299  void submodule_add(QString url = { }, QString const &local_dir = { });
300  const GitCommitItem &selectedCommitItem() const;
301  void commit(bool amend = false);
302  void commitAmend();
303 
304  void clone(CloneParams const &a);
305 
306  void push(bool set_upstream, QString const &remote, QString const &branch, bool force);
307  void fetch(GitRunner g, bool prune);
308  void stage(GitRunner g, const std::vector<std::string> &paths);
309  void fetch(GitRunner g);
310  void pull(GitRunner g);
311  void push_tags(GitRunner g);
312  void delete_tags(GitRunner g, const std::vector<std::string> &names);
313  void add_tag(GitRunner g, const std::string &name, GitHash const &commit_id);
314 
315  bool push();
316 
317  void deleteBranch(const GitCommitItem &commit);
318  void deleteSelectedBranch();
319  void resetFile(const QStringList &paths);
320  void clearAuthentication();
321  void clearSshAuthentication();
322  void internalDeleteTags(const std::vector<std::string> &tagnames);
323  void internalAddTag(const std::string &name);
324  void createRepository(QString const &dir);
325  void addRepository(QString const &local_dir, QString const &group = { });
326  void addRepositoryAccepted(const AddRepositoryDialog &dlg);
327  void scanFolderAndRegister(QString const &group);
328  void doGitCommand(const std::function<void(GitRunner)> &callback);
329  void setWindowTitle_(const GitUser &user);
330  void setUnknownRepositoryInfo();
331  void setCurrentRemoteName(const std::string &name);
332  void deleteTags(const GitCommitItem &commit);
333  std::vector<std::string> remotes() const;
334  BranchList findBranch(const GitHash &id);
335  QString tempfileHeader() const;
336  void deleteTempFiles();
337  QString newTempFilePath();
338  int limitLogCount() const;
339  bool isThereUncommittedChanges() const;
340  GitCommitItemList retrieveCommitLog(GitRunner g) const;
341  const std::map<GitHash, BranchList> &branchmap() const;
342 
343  void updateWindowTitle(const GitUser &user);
344  void updateWindowTitle(GitRunner g);
345 
346  std::tuple<QString, BranchLabelList> makeCommitLabels(GitCommitItem const &commit, std::map<GitHash, BranchList> const &branch_map, std::map<GitHash, TagList> const &tag_map) const;
347  QString labelsInfoText(GitCommitItem const &commit);
348 
349  void removeRepositoryFromBookmark(RepositoryTreeIndex const &index, bool ask);
350  void openTerminal(const RepositoryInfo *repo);
351  void openExplorer(const RepositoryInfo *repo);
352  bool askAreYouSureYouWantToRun(QString const &title, QString const &command);
353  bool editFile(QString const &path, QString const &title);
354  void setAppSettings(const ApplicationSettings &appsettings);
355 
356  void saveApplicationSettings();
357 
358  void setDiffResult(std::vector<GitDiff> &&diffs);
359  const std::vector<GitSubmoduleItem> &submodules() const;
360  void setSubmodules(const std::vector<GitSubmoduleItem> &submodules);
361  bool runOnRepositoryDir(const std::function<void(QString, QString)> &callback, const RepositoryInfo *repo);
362  NamedCommitList namedCommitItems(int flags);
363 
364  const std::map<GitHash, TagList> &tagmap() const;
365  std::map<GitHash, TagList> queryTags(GitRunner g);
366  TagList findTag(const GitHash &id) const;
367 
368  void sshSetPassphrase(const std::string &user, const std::string &pass);
369  std::string sshPassphraseUser() const;
370  std::string sshPassphrasePass() const;
371  void httpSetAuthentication(const std::string &user, const std::string &pass);
372  std::string httpAuthenticationUser() const;
373  std::string httpAuthenticationPass() const;
374  const GitCommitItem *getLog(int index) const;
375 
376  bool saveRepositoryBookmarks();
377  QString getBookmarksFilePath() const;
378  void stopPtyProcess();
379  void abortPtyProcess();
380  PtyProcess *getPtyProcess();
381  PtyProcess const *getPtyProcess() const;
382  bool getPtyProcessOk() const;
383  bool isPtyProcessRunning() const;
384  void setCompletedHandler(std::function<void(bool, const QVariant &)> fn, const QVariant &userdata);
385  void setPtyProcessOk(bool pty_process_ok);
386 
387  const std::vector<RepositoryInfo> &repositoryList() const;
388  void setRepositoryList(std::vector<RepositoryInfo> &&list);
389 
390  bool interactionEnabled() const;
391  void setInteractionEnabled(bool enabled);
392  InteractionMode interactionMode() const;
393  void setInteractionMode(const InteractionMode &im);
394  void setUncommittedChanges(bool uncommited_changes);
395 
396 public:
397  struct DiffResult {
398  std::vector<GitDiff> list_;
399  mutable std::vector<GitDiff const *> ptrs_;
400  DiffResult() = default;
402  : list_(r.list_)
403  {
404  ptrs_.clear();
405  }
406  void operator = (DiffResult const &r)
407  {
408  list_ = r.list_;
409  ptrs_.clear();
410  }
411  void setList(std::vector<GitDiff> &&list)
412  {
413  list_ = std::move(list);
414  ptrs_.clear();
415  }
416  std::basic_string_view<GitDiff const *> items() const
417  {
418  if (ptrs_.empty()) {
419  const size_t N = list_.size();
420  ptrs_.resize(N);
421  for (size_t i = 0; i < N; i++) {
422  ptrs_[i] = &list_[i];
423  }
424  }
425  return std::basic_string_view<GitDiff const *>(ptrs_.data(), ptrs_.size());
426  }
427  };
428 private:
429  std::basic_string_view<const GitDiff *> diffResult() const;
430 
431  void clearLabelMap();
432  GitObjectCache *getObjCache();
433  bool getForceFetch() const;
434  void setForceFetch(bool force_fetch);
435  GitHash getHeadId() const;
436  void setHeadId(const GitHash &head_id);
437  void setPtyProcessCompletionData(const QVariant &value);
438  const QVariant &getTempRepoForCloneCompleteV() const;
439  void msgNoRepositorySelected();
440  bool isRepositoryOpened() const;
441  void initRepository(QString const &path, QString const &reponame, const GitRemote &remote);
442  void updatePtyPocessLog(bool processevents);
443  void appendLogHistory(const QByteArray &str, LogChannel channel);
444  std::vector<std::string> readLogHistoryLines(LogChannel channel);
445  void clearLogHistory(LogChannel channel);
446  void updateAvatar(const GitUser &user, bool request);
447  void cleanSubModule(GitRunner g, QListWidgetItem *item);
448 
449  void updateUncommittedChanges(GitRunner g);
451  QString preferredRepositoryGroup() const;
452  void setPreferredRepositoryGroup(QString const &group);
453  bool _addExistingLocalRepository(QString dir, QString name, QString sshkey, bool open, bool save = true, bool msgbox_if_err = true);
454  void addExistingLocalRepositoryWithGroup(QString const &dir, QString const &group);
455  bool addExistingLocalRepository(QString const &dir, bool open);
456  QString currentFileMimeFileType() const;
457 
458  int rowFromCommitId(const GitHash &id);
459 
460  void _updateCommitLogTableView(int delay_ms);
461  void makeCommitLog(GitHash const &head, CommitLogExchangeData exdata, int scroll_pos, int select_row);
462 
463  void updateButton();
464  void runPtyGit(QString const &progress_message, GitRunner g, GitCommandRunner::variant_t var, std::function<void(ProcessStatus *, QVariant const &userdata)> callback, QVariant const &userdata);
465  CommitLogExchangeData queryCommitLog(GitRunner g, bool suppress_uncommit_changes);
466 
467  bool jump(GitRunner g, const GitHash &id);
468  void jump(GitRunner g, QString const &text);
469 
470  void connectPtyProcessCompleted();
471  void setupShowFileListHandler();
472 
473  void setRetry(std::function<void(const QVariant &)> fn, const QVariant &var);
474  void clearRetry();
475  void retry();
476  bool isRetryQueued() const;
477 
478  void clearGitCommandCache();
479  void clearGitObjectCache();
480 
481  GitCommitItemList log_all2(GitRunner g, const GitHash &id, int maxcount) const;
482  ProgressWidget *progress_widget() const;
483  void internalShowPanel(FileListType file_list_type);
484 
485  void showFileList(FileListType files_list_type);
487  void setupAddFileObjectData();
488  void addFileObjectData(const MainWindowExchangeData &data);
489  void setupStatusInfoHandler();
490  void connectSetCommitLog();
491 
492  void _chooseRepository(QTreeWidgetItem *item);
493  void chooseRepository();
494  void setCurrentGitRunner(GitRunner g);
495  void endSession();
496  std::optional<GitCommitItem> getCommitItem(GitRunner g, const GitHash &hash) const;
497  GitHash blobID(QListWidgetItem *item) const;
498  bool copyWorkingCopyDirToClipboard();
499 
500 protected:
501  void closeEvent(QCloseEvent *event) override;
502  void dragEnterEvent(QDragEnterEvent *event) override;
503  void keyPressEvent(QKeyEvent *event) override;
504  bool event(QEvent *event) override;
505  bool eventFilter(QObject *watched, QEvent *event) override;
506  std::optional<RepositoryInfo> selectedRepositoryItem() const;
507  void removeSelectedRepositoryFromBookmark(bool ask);
508 
509 protected slots:
510  void onLogIdle();
511 
512 private slots:
513  void updateUI();
514  void onLogVisibilityChanged();
515  void onRepositoriesTreeDropped();
516  void onInterval10ms();
517  void onAvatarReady();
518  void onCommitDetailGetterReady();
519  void onPtyProcessCompleted(bool ok, PtyProcessCompleted const &data);
520  void onSetCommitLog(const CommitLogExchangeData &log);
521  void onCommitLogCurrentRowChanged(int row);
522 
523  void on_action_about_triggered();
524  void on_action_add_repository_triggered();
525  void on_action_clean_df_triggered();
526  void on_action_commit_triggered();
527  void on_action_create_desktop_launcher_file_triggered();
528  void on_action_delete_branch_triggered();
529  void on_action_delete_remote_branch_triggered();
530  void on_action_edit_git_config_triggered();
531  void on_action_edit_gitignore_triggered();
532  void on_action_edit_global_gitconfig_triggered();
533  void on_action_edit_settings_triggered();
534  void on_action_edit_tags_triggered();
535  void on_action_exit_triggered();
536  void on_action_expand_commit_log_triggered();
537  void on_action_expand_diff_view_triggered();
538  void on_action_expand_file_list_triggered();
539  void on_action_explorer_triggered();
540  void on_action_fetch_prune_triggered();
541  void on_action_fetch_triggered();
542  void on_action_find_next_triggered();
543  void on_action_find_triggered();
544  void on_action_offline_triggered();
545  void on_action_online_triggered();
546  void on_action_pull_triggered();
547  void on_action_push_all_tags_triggered();
548  void on_action_push_triggered();
549  void on_action_reflog_triggered();
550  void on_action_repo_checkout_triggered();
551  void on_action_repo_jump_to_head_triggered();
552  void on_action_repo_jump_triggered();
553  void on_action_repo_merge_triggered();
554  void on_action_repositories_panel_triggered();
555  void on_action_repository_property_triggered();
556  void on_action_repository_status_triggered();
557  void on_action_reset_HEAD_1_triggered();
558  void on_action_reset_hard_triggered();
559  void on_action_configure_user_triggered();
560  void on_action_set_gpg_signing_triggered();
561  void on_action_show_labels_triggered();
562  void on_action_show_graph_triggered();
563  void on_action_show_avatars_triggered();
564  void on_action_sidebar_triggered();
565  void on_action_stash_apply_triggered();
566  void on_action_stash_drop_triggered();
567  void on_action_stash_triggered();
568  void on_action_stop_process_triggered();
569  void on_action_submodule_add_triggered();
570  void on_action_submodule_update_triggered();
571  void on_action_submodules_triggered();
572  void on_action_terminal_triggered();
573  void on_action_view_refresh_triggered();
574  void on_action_window_log_triggered(bool checked);
575  void on_listWidget_files_currentRowChanged(int currentRow);
576  void on_listWidget_files_customContextMenuRequested(const QPoint &pos);
577  void on_listWidget_files_itemDoubleClicked(QListWidgetItem *item);
578  void on_listWidget_staged_currentRowChanged(int currentRow);
579  void on_listWidget_staged_customContextMenuRequested(const QPoint &pos);
580  void on_listWidget_staged_itemDoubleClicked(QListWidgetItem *item);
581  void on_listWidget_unstaged_currentRowChanged(int currentRow);
582  void on_listWidget_unstaged_customContextMenuRequested(const QPoint &pos);
583  void on_listWidget_unstaged_itemDoubleClicked(QListWidgetItem *item);
584  void on_radioButton_remote_offline_clicked();
585  void on_radioButton_remote_online_clicked();
586  void on_tableWidget_log_customContextMenuRequested(const QPoint &pos);
587  void on_tableWidget_log_doubleClicked(const QModelIndex &index);
588  void on_toolButton_commit_clicked();
589  void on_toolButton_explorer_clicked();
590  void on_toolButton_fetch_clicked();
591  void on_toolButton_pull_clicked();
592  void on_toolButton_push_clicked();
593  void on_toolButton_select_all_clicked();
594  void on_toolButton_stage_clicked();
595  void on_toolButton_status_clicked();
596  void on_toolButton_stop_process_clicked();
597  void on_toolButton_terminal_clicked();
598  void on_toolButton_unstage_clicked();
599  void on_treeWidget_repos_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous);
600  void on_treeWidget_repos_customContextMenuRequested(const QPoint &pos);
601  void on_treeWidget_repos_itemDoubleClicked(QTreeWidgetItem *item, int column);
602  void on_toolButton_addrepo_clicked();
603 
604  void test();
605  void toggleMaximized();
606 
607  void onRemoteInfoChanged();
608  void onShowStatusInfo(StatusInfo const &info);
609 
611  {
613 
614  clearDiffView();
615 
616  internalShowPanel(panel_type);
617  }
618  void onAddFileObjectData(const MainWindowExchangeData &data);
619 
620  void on_action_view_sort_by_time_changed();
621 
622  void on_action_ssh_triggered();
623 
624  void on_action_restart_trace_logger_triggered();
625 
626  void on_action_rebase_continue_triggered();
627  void on_action_rebase_quit_triggered();
628  void on_action_rebase_abort_triggered();
629 
630 signals:
632  void signalSetProgress(float progress);
633  void signalShowStatusInfo(StatusInfo const &info);
635  void sigWriteLog(LogData const &logdata, LogChannel channel);
639  void sigPtyCloneCompleted(bool ok, QVariant const &userdata);
640  void sigPtyFetchCompleted(bool ok, QVariant const &userdata);
641  void sigPtyProcessCompleted(bool ok, PtyProcessCompleted const &data);
643 
644 public:
645  explicit MainWindow(QWidget *parent = nullptr);
646  ~MainWindow() override;
647 
648  QColor color(unsigned int i);
649  bool isOnlineMode() const;
650  void updateCurrentFileList();
651  RepositoryTreeWidget::RepositoryListStyle repositoriesListStyle() const;
652  void updateRepositoryList(RepositoryTreeWidget::RepositoryListStyle style = RepositoryTreeWidget::RepositoryListStyle::_Keep, int select_row = -1, QString const &search_text = { });
653 
654  TagList queryCurrentCommitTagList() const;
655 
656  static int indexOfLog(const QListWidgetItem *item);
657  static int indexOfDiff(const QListWidgetItem *item);
658  static std::vector<GitSubmoduleItem> updateSubmodules(GitRunner g, const GitHash &id);
659  static void updateCommitGraph(GitCommitItemList *logs);
660  static TagList findTag(std::map<GitHash, TagList> const &tagmap, GitHash const &id);
661  static QString makeRepositoryName(QString const &loc);
662  static void addDiffItems(std::basic_string_view<const GitDiff *> diff_list, const std::function<void(const ObjectData &)> &add_item);
663  static GitHash getObjectID(const QListWidgetItem *item);
664  static QString getFilePath(const QListWidgetItem *item);
665  static QString getSubmodulePath(const QListWidgetItem *item);
666  static QString getSubmoduleCommitId(const QListWidgetItem *item);
667  static std::pair<QString, QString> makeFileItemText(const ObjectData &data);
668  static QListWidgetItem *newListWidgetFileItem(const MainWindow::ObjectData &data);
669  static std::string parseDetectedDubiousOwnershipInRepositoryAt(const std::vector<std::string> &lines);
670  static QString abbrevCommitID(const GitCommitItem &commit);
671  static bool isValidWorkingCopy(GitRunner g);
672  bool isValidWorkingCopy(QString const &local_dir);
673 
674  static constexpr int DIGIT_WIDTH = 5;
675  static constexpr int DIGIT_HEIGHT = 7;
676  static void drawDigit(QPainter *pr, int x, int y, int n);
677 
678  void setStatusInfo(StatusInfo const &info);
679  void clearStatusInfo();
680  bool setCurrentLogRow(int row);
681  bool shown();
682  void deleteTags(const std::vector<std::string> &tagnames);
683  void addTag(const std::string &name);
684  int selectedLogIndex() const;
685  void updateAncestorCommitMap();
686  bool isAncestorCommit(GitHash const &id) const;
687  void postStartEvent(int ms_later);
688  void setShowLabels(bool show, bool save);
689  void setShowGraph(bool show, bool save);
690  void setShowAvatars(bool show, bool save);
691  bool isLabelsVisible() const;
692  bool isGraphVisible() const;
693  bool isAvatarsVisible() const;
694  bool isAvatarEnabled() const;
695  DiffResult makeDiffList(const GitHash &id, QListWidget *listwidget);
696  void execCommitViewWindow(const GitCommitItem *commit);
697  void execCommitPropertyDialog(QWidget *parent, const GitCommitItem &commit);
698  void execCommitExploreWindow(QWidget *parent, const GitCommitItem *commit);
699  void execFileHistory(QString const &path);
700  void execFileHistory(const QListWidgetItem *item);
701  void showObjectProperty(const QListWidgetItem *item);
702  bool testRemoteRepositoryValidity(QString const &url, QString const &sshkey);
703  QString selectGitCommand(bool save);
704  QString selectGpgCommand(bool save);
705  QString selectSshCommand(bool save);
706  const GitBranch &currentBranch() const;
707  void setCurrentBranch(const GitBranch &b);
708  const RepositoryInfo &currentRepository() const;
709  QString currentRepositoryName() const;
710  std::string currentRemoteName() const;
711  std::string currentBranchName() const;
712  GitRunner _git(const QString &dir, const QString &submodpath, const QString &sshkey) const;
713  GitRunner unassosiated_git_runner() const;
714  GitRunner new_git_runner(const QString &dir, const QString &sshkey);
715  GitRunner new_git_runner();
716  GitRunner git();
717  static GitRunner git_for_submodule(GitRunner g, GitSubmoduleItem const &submod);
718  bool isValidWorkingCopy(QString const &dir) const;
719  void autoOpenRepository(QString dir, QString const &commit_id = { });
720  std::optional<GitCommitItem> queryCommit(const GitHash &id);
721  bool checkoutLocalBranch(const std::string &name);
722  void checkout(QWidget *parent, const GitCommitItem &commit, std::function<void()> accepted_callback = { });
723  void checkout();
724 
725  bool jumpToCommit(const GitHash &id);
726  bool jumpToCommitWithRevParse(const std::string &id);
727  bool jumpToHEAD();
728 
729  TextEditorThemePtr themeForTextEditor();
730  void emitWriteLog(LogData const &logdata, LogChannel channel);
731  QString findFileID(const GitHash &commit_id, QString const &file);
732  const GitCommitItem &commitItem(int row) const;
733  const GitCommitItem &commitItem(GitHash const &id) const;
734  QImage committerIcon(int row, QSize size) const;
735  void changeSshKey(QString const &local_dir, QString const &ssh_key, bool save);
736  ApplicationSettings *appsettings();
737  const ApplicationSettings *appsettings() const;
738  QString defaultWorkingDir() const;
739  QIcon signatureVerificationIcon(const GitHash &id) const;
740  QAction *addMenuActionProperty(QMenu *menu);
741  QString currentWorkingCopyDir() const;
742 
743  void refresh();
744  bool cloneRepository(const GitCloneData &clonedata, const RepositoryInfo &repodata);
745  GitUser currentGitUser() const;
746  void setupExternalPrograms();
747  void updateCommitLogTableViewLater();
748  void saveRepositoryBookmark(RepositoryInfo item);
749  void changeRepositoryBookmarkName(RepositoryInfo item, QString new_name);
750  BranchLabelList rowLabels(int row, bool sorted = true) const;
751  void setProgress(float progress);
752  void showProgress(QString const &text, float progress = -1.0f);
753  void hideProgress();
754  void internalAfterFetch();
755  void onRepositoryTreeSortRecent(bool f);
756 
757 private:
758  const GitCommitItemList &commitlog() const;
759 public:
760  std::basic_string_view<GitCommitItem *> commitlogItems() const;
761 
762  const GitCommitItem *currentCommitItem();
763  void clearLogContents();
764  void updateLogTableView();
765  void setFocusToLogTable();
766  void selectLogTableRow(int row);
767 
768  void setCurrentRepositoryData(RepositoryData &&data);
769  const RepositoryData *currentRepositoryData() const;
770 
771  void setCommitLog(CommitLogExchangeData &&exdata);
772  bool saveFileAs(QString const &srcpath, QString const &dstpath);
773  bool saveBlobAs(const GitHash &id, QString const &dstpath);
774 
775  bool isIncrementalSearching() const;
776 
777  static void openTerminal(QString const &dir, QString const &ssh_key);
778  static void openExplorer(QString const &dir, QString const &ssh_key);
779  static void openNewGuitar(QString const &path, QString const &commit_id);
780 public slots:
781  void internalWriteLog(const LogData &logdata, LogChannel channel);
782 };
783 
785 public:
787  std::vector<MainWindow::ObjectData> object_data;
788 };
789 Q_DECLARE_METATYPE(MainWindowExchangeData)
790 
791 #endif // MAINWINDOW_H
#define ASSERT_MAIN_THREAD()
Definition: ApplicationGlobal.h:149
static std::string git(std::string const &gitcommand, std::string const &dir, std::string const &cmd)
HEADとの差分を取得する内部実装。
Definition: CommitMessageGenerator.cpp:146
GitMergeFastForward
Definition: GitTypes.h:416
std::vector< NamedCommitItem > NamedCommitList
Definition: Git.h:262
LogChannel
Definition: MainWindow.h:39
QList< BranchLabel > BranchLabelList
Definition: RepositoryModel.h:9
QList< GitBranch > BranchList
Definition: RepositoryModel.h:8
std::vector< GitTag > TagList
Definition: RepositoryModel.h:7
std::shared_ptr< TextEditorTheme > TextEditorThemePtr
Definition: TextEditorTheme.h:9
Definition: AboutDialog.h:10
Definition: AddRepositoryDialog.h:14
Definition: ApplicationSettings.h:46
ログテーブルウィジェットのブランチ名ラベル
Definition: BranchLabel.h:11
Definition: FileDiffSliderWidget.h:21
The FileDiffWidget class サイドバイサイドで2つのファイルのdiffを表示するウィジェット
Definition: FileDiffWidget.h:40
Definition: FileHistoryWindow.h:14
std::variant< Git_clone, Git_fetch, Git_stage, Git_push, Git_pull, Git_push_tags, Git_delete_tag, Git_delete_tags, Git_add_tag, Git_submodule_add > variant_t
Definition: GitCommandRunner.h:133
Definition: GitTypes.h:157
Definition: GitTypes.h:31
Definition: GitObjectManager.h:38
Definition: GitRunner.h:13
Definition: MainWindow.h:71
std::vector< std::string > lines
Definition: MainWindow.h:75
size_t pos
Definition: MainWindow.h:74
size_t len
Definition: MainWindow.h:74
int hunk_number
Definition: MainWindow.h:73
Definition: ImageViewWidget.h:14
Definition: MainWindow.h:784
MainWindow::FileListType files_list_type
Definition: MainWindow.h:786
std::vector< MainWindow::ObjectData > object_data
Definition: MainWindow.h:787
Definition: MainWindow.h:165
QByteArray content
Definition: MainWindow.h:168
bool is(GitObject::Type t) const
Definition: MainWindow.h:173
Definition: MainWindow.h:96
void signalShowStatusInfo(StatusInfo const &info)
void signalSetProgress(float progress)
@ FilePathRole
Definition: MainWindow.h:110
@ DiffIndexRole
Definition: MainWindow.h:111
@ HeaderRole
Definition: MainWindow.h:113
@ ObjectIdRole
Definition: MainWindow.h:112
@ SubmoduleCommitIdRole
Definition: MainWindow.h:115
@ SubmodulePathRole
Definition: MainWindow.h:114
void setForceFetch(bool force_fetch)
Ui::MainWindow * ui
Definition: MainWindow.h:151
static std::pair< QString, QString > makeFileItemText(const ObjectData &data)
Private * m
Definition: MainWindow.h:153
void sigShowFileList(MainWindow::FileListType files_list_type)
InteractionMode
Definition: MainWindow.h:122
@ None
Definition: MainWindow.h:123
@ Busy
Definition: MainWindow.h:124
void signalHideProgress()
void onShowFileList(MainWindow::FileListType panel_type)
Definition: MainWindow.h:610
NamedCommitFlag
Definition: MainWindow.h:127
void sigPtyFetchCompleted(bool ok, QVariant const &userdata)
QString currentFileMimeFileType() const
void sigPtyCloneCompleted(bool ok, QVariant const &userdata)
FileListType
Definition: MainWindow.h:133
CloneOperation
Definition: MainWindow.h:117
@ SubmoduleAdd
Definition: MainWindow.h:119
@ Clone
Definition: MainWindow.h:118
void enableDragAndDropOnRepositoryTree(bool enabled)
static QString appendCharToFilterText(QString filter, const QString &add)
bool getForceFetch() const
void sigWriteLog(LogData const &logdata, LogChannel channel)
void signalAddFileObjectData(const MainWindowExchangeData &data)
void signalUpdateCommitLog()
void connectShowFileListHandler()
void sigPtyProcessCompleted(bool ok, PtyProcessCompleted const &data)
FilterTarget
Definition: MainWindow.h:160
void remoteInfoChanged()
void updateButton()
void sigSetCommitLog(CommitLogExchangeData const &log)
Definition: MyProcess.h:21
Definition: ProgressWidget.h:10
Definition: MainWindow.h:82
PtyProcessCompleted()
Definition: MainWindow.h:89
QString process_name
Definition: MainWindow.h:87
QVariant userdata
Definition: MainWindow.h:86
std::function< void(ProcessStatus *, QVariant const &)> callback
Definition: MainWindow.h:84
QElapsedTimer elapsed
Definition: MainWindow.h:88
std::shared_ptr< ProcessStatus > status
Definition: MainWindow.h:85
Definition: RepositoryTreeWidget.h:20
RepositoryListStyle
Definition: RepositoryTreeWidget.h:24
Definition: StatusInfo.h:8
Definition: UnixPtyProcess.h:7
Definition: UserEvent.h:31
std::variant< StartEventData, CloneRepositoryEventData > variant_t
Definition: UserEvent.h:36
Definition: AboutDialog.h:6
QString appendCharToFilterText(QString filter, QString const &add)
Definition: IncrementalSearchHelper.cpp:77
static Variant var(jstream::Reader const &reader)
Definition: jstream.h:1738
Definition: GitTypes.h:74
Definition: MainWindow.h:33
RepositoryInfo repodata
Definition: MainWindow.h:35
GitCloneData clonedata
Definition: MainWindow.h:34
Definition: RepositoryModel.h:18
Definition: GitTypes.h:276
Definition: GitTypes.h:303
Definition: GitTypes.h:121
Definition: MainWindow.h:66
QString repository_name
Definition: MainWindow.h:68
QString owner_account_name
Definition: MainWindow.h:67
Type
Definition: GitTypes.h:85
Definition: GitTypes.h:11
Definition: GitTypes.h:422
Definition: GitTypes.h:267
Definition: MainWindow.h:44
LogData(QByteArray const &ba)
Definition: MainWindow.h:47
LogData(char const *p, int n)
Definition: MainWindow.h:55
LogData(std::string_view const &s)
Definition: MainWindow.h:59
QByteArray data
Definition: MainWindow.h:45
LogData(QString const &s)
Definition: MainWindow.h:51
LogData()=default
Definition: MainWindow.h:397
std::vector< GitDiff > list_
Definition: MainWindow.h:398
std::vector< GitDiff const * > ptrs_
Definition: MainWindow.h:399
DiffResult(DiffResult const &r)
Definition: MainWindow.h:401
void setList(std::vector< GitDiff > &&list)
Definition: MainWindow.h:411
std::basic_string_view< GitDiff const * > items() const
Definition: MainWindow.h:416
Definition: MainWindow.h:140
QString header
Definition: MainWindow.h:145
std::string path
Definition: MainWindow.h:142
GitSubmoduleItem submod
Definition: MainWindow.h:143
GitCommitItem submod_commit
Definition: MainWindow.h:144
size_t idiff
Definition: MainWindow.h:146
std::string id
Definition: MainWindow.h:141
Definition: MainWindow.h:189
Definition: MainWindow.cpp:141
Definition: MainWindow.h:258
QStringList branches
Definition: MainWindow.h:259
QStringList all_branches
Definition: MainWindow.h:260
Definition: MainWindow.h:156
Definition: RepositoryModel.h:11
Definition: RepositoryInfo.h:7