TrackGit
TrackGit.cpp
Go to the documentation of this file.
1 
9 #include <Alert.h>
10 #include <Application.h>
11 #include <AppKit.h>
12 #include <Catalog.h>
13 #include <InterfaceKit.h>
14 #include <StorageKit.h>
15 #include <SupportKit.h>
16 #include <MenuItem.h>
17 
18 #include <stdio.h>
19 #include <strings.h>
20 #include <vector>
21 #include <add-ons/tracker/TrackerAddOn.h>
22 
23 #include "Utils.h"
24 #include "TrackGitApp.h"
25 
26 #include <git2.h>
27 
28 #define B_TRANSLATION_CONTEXT "TrackGit"
29 
30 extern "C" {
31  void populate_menu (BMessage* msg, BMenu* menu, BHandler* handler);
32  void message_received (BMessage* msg);
33 }
34 
35 
41 void
42 process_refs(entry_ref dir_ref, BMessage* msg, void*)
43 {
44  BString buffer("TrackGit: A Tracker Addon for Git Version Control System");
45  BAlert *alert = new BAlert("", buffer.String(), "Cancel",
46  0, 0, B_WIDTH_AS_USUAL, B_WARNING_ALERT);
47  alert->Go();
48 }
49 
50 
58 void
59 populate_menu(BMessage* msg, BMenu* menu, BHandler* handler)
60 {
61  if (menu == NULL){
62  BString buffer("Null menu");
63  BAlert *alert = new BAlert("", buffer.String(), "Cancel",
64  0, 0, B_WIDTH_AS_USUAL, B_WARNING_ALERT);
65  alert->Go();
66  return;
67  }
68 
69  // Remove Menu item if already exists.
70  BMenuItem* item = menu->FindItem(ADDON_NAME);
71  if (item != NULL)
72  menu->RemoveItem(item);
73 
74  BMenu* submenu = new BMenu(ADDON_NAME);
75 
76  vector<char*> selected;
77  extract_selected_paths(msg, selected);
78  BString dirPath = extract_current_directory(msg);
79 
80  git_libgit2_init();
81  git_buf buf = GIT_BUF_INIT_CONST(NULL, 0);
82 
83  // Check if current directory is in git repo.
84  if (git_repository_discover(&buf, dirPath.String(), 0, NULL) == 0) {
85  // buf is git repo
86  git_repository* repo = NULL;
87  git_index* index;
88  // Init repo
89  git_repository_open_ext(&repo, dirPath.String(), 0, NULL);
90  // Init index
91  git_repository_index(&index, repo);
92  if (git_index_has_conflicts(index)) {
93  // Show conflicts menu item
94  BMessage* showConflictsMsg = new BMessage(*msg);
95  showConflictsMsg->AddInt32("addon_item_id", kShowConflicts);
96  BMenuItem* showConflictsItem = new BMenuItem(
97  B_TRANSLATE("Show conflicts" B_UTF8_ELLIPSIS),
98  showConflictsMsg);
99  submenu->AddItem(showConflictsItem);
100  }
101 
102  // Add Status menu item
103  BMessage* statusMsg = new BMessage(*msg);
104  statusMsg->AddInt32("addon_item_id", kStatus);
105  BMenuItem* statusItem = new BMenuItem(
106  B_TRANSLATE("Status" B_UTF8_ELLIPSIS), statusMsg);
107  submenu->AddItem(statusItem);
108 
109  // Add Commit menu item
110  BMessage* commitMsg = new BMessage(*msg);
111  commitMsg->AddInt32("addon_item_id", kCommit);
112  BMenuItem* commitItem = new BMenuItem(
113  B_TRANSLATE("Commit" B_UTF8_ELLIPSIS), commitMsg);
114  submenu->AddItem(commitItem);
115 
116  // Add Pull menu item
117  BMessage* pullMsg = new BMessage(*msg);
118  pullMsg->AddInt32("addon_item_id", kPull);
119  BMenuItem* pullItem = new BMenuItem(
120  B_TRANSLATE("Pull" B_UTF8_ELLIPSIS), pullMsg);
121  submenu->AddItem(pullItem);
122 
123  // Add Push menu item
124  BMessage* pushMsg = new BMessage(*msg);
125  pushMsg->AddInt32("addon_item_id", kPush);
126  BMenuItem* pushItem = new BMenuItem(
127  B_TRANSLATE("Push" B_UTF8_ELLIPSIS), pushMsg);
128  submenu->AddItem(pushItem);
129 
130  // Add Create Branch menu item
131  BMessage* createBranchMsg = new BMessage(*msg);
132  createBranchMsg->AddInt32("addon_item_id", kCreateBranch);
133  BMenuItem* createBranchItem = new BMenuItem(
134  B_TRANSLATE("Create branch" B_UTF8_ELLIPSIS), createBranchMsg);
135  submenu->AddItem(createBranchItem);
136 
137  // Add Switch Branch menu item
138  BMessage* switchBranchMsg = new BMessage(*msg);
139  switchBranchMsg->AddInt32("addon_item_id", kSwitchBranch);
140  BMenuItem* switchBranchItem = new BMenuItem(
141  B_TRANSLATE("Switch branch" B_UTF8_ELLIPSIS), switchBranchMsg);
142  submenu->AddItem(switchBranchItem);
143 
144  // Add Log menu item
145  BMessage* logMsg = new BMessage(*msg);
146  logMsg->AddInt32("addon_item_id", kLog);
147  BMenuItem* logItem = new BMenuItem(
148  B_TRANSLATE("Log" B_UTF8_ELLIPSIS), logMsg);
149  submenu->AddItem(logItem);
150 
151  if (selected.size() > 0) {
152  // Add "Add Files" menu item
153  BMessage* addMsg = new BMessage(*msg);
154  addMsg->AddInt32("addon_item_id", kAdd);
155  BMenuItem* addItem = new BMenuItem(
156  B_TRANSLATE("Add files"), addMsg);
157  submenu->AddItem(addItem);
158  } else {
159  // Add "Add All Files" menu item
160  BMessage* addMsg = new BMessage(*msg);
161  addMsg->AddInt32("addon_item_id", kAddAll);
162  BMenuItem* addItem = new BMenuItem(
163  B_TRANSLATE("Add all files"), addMsg);
164  submenu->AddItem(addItem);
165  }
166  } else {
167  // dirPath does not belong to git repo
168  // Add Clone menu item
169  BMessage* cloneMsg = new BMessage(*msg);
170  cloneMsg->AddInt32("addon_item_id", kClone);
171  BMenuItem* cloneItem = new BMenuItem(
172  B_TRANSLATE("Clone" B_UTF8_ELLIPSIS), cloneMsg);
173  submenu->AddItem(cloneItem);
174 
175  // Add "Init Here" only if no files are selected.
176  if (selected.size() == 0) {
177  // Add Init here
178  BMessage* initMsg = new BMessage(*msg);
179  initMsg->AddInt32("addon_item_id", kInitHere);
180  BMenuItem* initItem = new BMenuItem(B_TRANSLATE("Init Here"),
181  initMsg);
182  submenu->AddItem(initItem);
183  }
184  }
185 
186  menu->AddItem(submenu);
187  submenu->SetTargetForItems(handler);
188 
189  git_buf_free(&buf);
190  git_libgit2_shutdown();
191 }
192 
193 
198 void
199 message_received(BMessage* msg)
200 {
201  int32 itemId;
202 
203  if (msg->FindInt32("addon_item_id", &itemId) != B_OK)
204  return;
205 
206  BMessenger messenger(APP_SIGN);
207 
208  if (!messenger.IsValid()) {
209  be_roster->Launch(APP_SIGN);
210  messenger = BMessenger(APP_SIGN);
211  }
212  messenger.SendMessage(msg);
213 }
214 
215 
220 int
222 {
223  TrackGitApp app;
224  app.Run();
225  return 0;
226 }
#define APP_SIGN
The Application signature.
Definition: Utils.h:45
void process_refs(entry_ref dir_ref, BMessage *msg, void *)
process_ref definition for addon.
Definition: TrackGit.cpp:42
Definition: Utils.h:27
void populate_menu(BMessage *msg, BMenu *menu, BHandler *handler)
Populates menu for this addon.
Definition: TrackGit.cpp:59
void extract_selected_paths(const BMessage *msg, vector< char *> &selected)
Get selected files.
Definition: Utils.cpp:50
void message_received(BMessage *msg)
Handler for received messages.
Definition: TrackGit.cpp:199
#define ADDON_NAME
The addon name.
Definition: Utils.h:40
Definition: Utils.h:26
int main()
The main function of TrackGit.
Definition: TrackGit.cpp:221
Header file of Utils.
BString extract_current_directory(const BMessage *msg)
Get current directory.
Definition: Utils.cpp:28
Definition: Utils.h:24
Definition: Utils.h:25
The TrackGit Application class.
Definition: TrackGitApp.h:24
Definition: Utils.h:33
Header file of TrackGit App.
Definition: Utils.h:29
Definition: Utils.h:28
Definition: Utils.h:22