OSDN Git Service

initial icon overlay support using the wingit lib
[tortoisegit/TortoiseGitJp.git] / src / Git / GitStatus.h
1 #pragma once\r
2 \r
3 #ifdef _MFC_VER\r
4 //#     include "SVNPrompt.h"\r
5 #endif\r
6 #include "TGitPath.h"\r
7 \r
8 #pragma warning (push,1)\r
9 typedef std::basic_string<wchar_t> wide_string;\r
10 #ifdef UNICODE\r
11 #       define stdstring wide_string\r
12 #else\r
13 #       define stdstring std::string\r
14 #endif\r
15 #pragma warning (pop)\r
16 \r
17 #include "TGitPath.h"\r
18 #include "wingit.h"\r
19 \r
20 typedef enum type_git_wc_status_kind\r
21 {\r
22         git_wc_status_none,\r
23         git_wc_status_unversioned,\r
24         git_wc_status_ignored,\r
25         git_wc_status_normal,\r
26         git_wc_status_external,\r
27         git_wc_status_incomplete,\r
28         git_wc_status_missing,\r
29         git_wc_status_deleted,\r
30         git_wc_status_replaced,\r
31         git_wc_status_modified,\r
32         git_wc_status_merged,\r
33         git_wc_status_added,\r
34         git_wc_status_conflicted,\r
35         git_wc_status_obstructed,\r
36 \r
37 }git_wc_status_kind;\r
38 \r
39 typedef enum\r
40 {\r
41         git_depth_empty,\r
42         git_depth_infinity,\r
43         git_depth_unknown,\r
44         git_depth_files,\r
45         git_depth_immediates,\r
46 }git_depth_t;\r
47 \r
48 \r
49 #define GIT_REV_ZERO _T("0000000000000000000000000000000000000000")\r
50 typedef CString git_revnum_t;\r
51 typedef int git_error_t;\r
52 \r
53 typedef struct git_wc_status2_t\r
54\r
55   /** The status of the entries text. */\r
56   git_wc_status_kind text_status;\r
57 \r
58   /** The status of the entries properties. */\r
59   git_wc_status_kind prop_status;\r
60 }git_wc_status2;\r
61 \r
62 #define MAX_STATUS_STRING_LENGTH                256\r
63 \r
64 \r
65 // convert wingit.dll status to git_wc_status_kind\r
66 inline static git_wc_status_kind GitStatusFromWingit(int nStatus)\r
67 {\r
68         switch (nStatus)\r
69         {\r
70         case WGFS_Normal: return git_wc_status_normal;\r
71         case WGFS_Modified: return git_wc_status_modified;\r
72         case WGFS_Deleted: return git_wc_status_deleted;\r
73         }\r
74 \r
75         return git_wc_status_none;\r
76 }\r
77 \r
78 \r
79 /**\r
80  * \ingroup Git\r
81  * Handles Subversion status of working copies.\r
82  */\r
83 class GitStatus\r
84 {\r
85 public:\r
86         GitStatus(bool * pbCanceled = NULL);\r
87         ~GitStatus(void);\r
88 \r
89 \r
90         /**\r
91          * Reads the Subversion status of the working copy entry. No\r
92          * recurse is done, even if the entry is a directory.\r
93          * If the status of the text and property part are different\r
94          * then the more important status is returned.\r
95          */\r
96         static git_wc_status_kind GetAllStatus(const CTGitPath& path, git_depth_t depth = git_depth_empty);\r
97 \r
98         /**\r
99          * Reads the Subversion status of the working copy entry and all its\r
100          * subitems. The resulting status is determined by using priorities for\r
101          * each status. The status with the highest priority is then returned.\r
102          * If the status of the text and property part are different then\r
103          * the more important status is returned.\r
104          */\r
105         static git_wc_status_kind GetAllStatusRecursive(const CTGitPath& path);\r
106 \r
107         /**\r
108          * Returns the status which is more "important" of the two statuses specified.\r
109          * This is used for the "recursive" status functions on folders - i.e. which status\r
110          * should be returned for a folder which has several files with different statuses\r
111          * in it.\r
112          */                                     \r
113         static git_wc_status_kind GetMoreImportant(git_wc_status_kind status1, git_wc_status_kind status2);\r
114         \r
115         /**\r
116          * Checks if a status is "important", i.e. if the status indicates that the user should know about it.\r
117          * E.g. a "normal" status is not important, but "modified" is.\r
118          * \param status the status to check\r
119          */\r
120         static BOOL IsImportant(git_wc_status_kind status) {return (GetMoreImportant(git_wc_status_added, status)==status);}\r
121 \r
122         /**\r
123          * Reads the Subversion text status of the working copy entry. No\r
124          * recurse is done, even if the entry is a directory.\r
125          * The result is stored in the public member variable status.\r
126          * Use this method if you need detailed information about a file/folder, not just the raw status (like "normal", "modified").\r
127          * \r
128          * \param path the pathname of the entry\r
129          * \param update true if the status should be updated with the repository. Default is false.\r
130          * \return If update is set to true the HEAD revision of the repository is returned. If update is false then -1 is returned.\r
131          * \remark If the return value is -2 then the status could not be obtained.\r
132          */\r
133         git_revnum_t GetStatus(const CTGitPath& path, bool update = false, bool noignore = false, bool noexternals = false);\r
134 \r
135         /**\r
136          * Returns a string representation of a Subversion status.\r
137          * \param status the status enum\r
138          * \param string a string representation\r
139          */\r
140         static void GetStatusString(git_wc_status_kind status, size_t buflen, TCHAR * string);\r
141         static void GetStatusString(HINSTANCE hInst, git_wc_status_kind status, TCHAR * string, int size, WORD lang);\r
142 \r
143         /**\r
144          * Returns the string representation of a depth.\r
145          */\r
146 #ifdef _MFC_VER\r
147         static CString GetDepthString(git_depth_t depth);\r
148 #endif\r
149         static void GetDepthString(HINSTANCE hInst, git_depth_t depth, TCHAR * string, int size, WORD lang);\r
150 \r
151         /**\r
152          * Returns the status of the first file of the given path. Use GetNextFileStatus() to obtain\r
153          * the status of the next file in the list.\r
154          * \param path the path of the folder from where the status list should be obtained\r
155          * \param retPath the path of the file for which the status was returned\r
156          * \param update set this to true if you want the status to be updated with the repository (needs network access)\r
157          * \param recurse true to fetch the status recursively\r
158          * \param bNoIgnore true to not fetch the ignored files\r
159          * \param bNoExternals true to not fetch the status of included Git:externals\r
160          * \return the status\r
161          */\r
162         git_wc_status2_t * GetFirstFileStatus(const CTGitPath& path, CTGitPath& retPath, bool update = false, git_depth_t depth = git_depth_infinity, bool bNoIgnore = true, bool bNoExternals = false);\r
163         unsigned int GetFileCount() const {return /*apr_hash_count(m_statushash);*/0;}\r
164         unsigned int GetVersionedCount() const;\r
165         /**\r
166          * Returns the status of the next file in the file list. If no more files are in the list then NULL is returned.\r
167          * See GetFirstFileStatus() for details.\r
168          */\r
169         git_wc_status2_t * GetNextFileStatus(CTGitPath& retPath);\r
170         /**\r
171          * Checks if a path is an external folder.\r
172          * This is necessary since Subversion returns two entries for external folders: one with the status Git_wc_status_external\r
173          * and one with the 'real' status of that folder. GetFirstFileStatus() and GetNextFileStatus() only return the 'real'\r
174          * status, so with this method it's possible to check if the status also is Git_wc_status_external.\r
175          */\r
176         bool IsExternal(const CTGitPath& path) const;\r
177         /**\r
178          * Checks if a path is in an external folder.\r
179          */\r
180         bool IsInExternal(const CTGitPath& path) const;\r
181 \r
182         /**\r
183          * Clears the memory pool.\r
184          */\r
185         void ClearPool();\r
186 \r
187         /**\r
188          * This member variable hold the status of the last call to GetStatus().\r
189          */\r
190         git_wc_status2_t *                      status;                         ///< the status result of GetStatus()\r
191 \r
192         git_revnum_t                            headrev;                        ///< the head revision fetched with GetFirstStatus()\r
193 \r
194         bool *                                          m_pbCanceled;\r
195 #ifdef _MFC_VER\r
196 friend class Git;       // So that Git can get to our m_err\r
197         /**\r
198          * Returns the last error message as a CString object.\r
199          */\r
200         CString GetLastErrorMsg() const;\r
201 \r
202         /** \r
203          * Set a list of paths which will be considered when calling GetFirstFileStatus.\r
204          * If a filter is set, then GetFirstFileStatus/GetNextFileStatus will only return items which are in the filter list\r
205          */\r
206         void SetFilter(const CTGitPathList& fileList);\r
207         void ClearFilter();\r
208 \r
209 #else\r
210         /**\r
211          * Returns the last error message as a CString object.\r
212          */\r
213         stdstring GetLastErrorMsg() const;\r
214 #endif\r
215 \r
216 \r
217 protected:\r
218 //      apr_pool_t *                            m_pool;                 ///< the memory pool\r
219 private:\r
220         typedef struct sort_item\r
221         {\r
222                 const void *key;\r
223 //              apr_ssize_t klen;\r
224                 void *value;\r
225         } sort_item;\r
226 \r
227         typedef struct hashbaton_t\r
228         {\r
229                 GitStatus*              pThis;\r
230 //              apr_hash_t *    hash;\r
231 //              apr_hash_t *    exthash;\r
232         } hash_baton_t;\r
233 \r
234 //      git_client_ctx_t *                      ctx;\r
235         git_wc_status_kind                      m_allstatus;    ///< used by GetAllStatus and GetAllStatusRecursive\r
236         git_error_t *                           m_err;                  ///< Subversion error baton\r
237 \r
238 #ifdef _MFC_VER\r
239 //      GitPrompt                                       m_prompt;\r
240 #endif\r
241 \r
242         /**\r
243          * Returns a numeric value indicating the importance of a status. \r
244          * A higher number indicates a more important status.\r
245          */\r
246         static int GetStatusRanking(git_wc_status_kind status);\r
247 \r
248         /**\r
249          * Callback function which collects the raw status from a Git_client_status() function call\r
250          */\r
251         //static git_error_t * getallstatus (void *baton, const char *path, git_wc_status2_t *status, apr_pool_t *pool);\r
252         static BOOL getallstatus(const struct wgFile_s *pFile, void *pUserData);\r
253 \r
254         /**\r
255          * Callback function which stores the raw status from a Git_client_status() function call\r
256          * in a hash table.\r
257          */\r
258 //      static git_error_t * getstatushash (void *baton, const char *path, git_wc_status2_t *status, apr_pool_t *pool);\r
259 \r
260         /**\r
261          * helper function to sort a hash to an array\r
262          */\r
263 //      static apr_array_header_t * sort_hash (apr_hash_t *ht, int (*comparison_func) (const sort_item *,\r
264 //                                                                              const sort_item *), apr_pool_t *pool);\r
265 \r
266         /**\r
267          * Callback function used by qsort() which does the comparison of two elements\r
268          */\r
269         static int __cdecl sort_compare_items_as_paths (const sort_item *a, const sort_item *b);\r
270 \r
271         //for GetFirstFileStatus and GetNextFileStatus\r
272 //      apr_hash_t *                            m_statushash;\r
273 //      apr_array_header_t *            m_statusarray;\r
274         unsigned int                            m_statushashindex;\r
275 //      apr_hash_t *                            m_externalhash;\r
276 \r
277 #pragma warning(push)\r
278 #pragma warning(disable: 4200)\r
279         struct STRINGRESOURCEIMAGE\r
280         {\r
281                 WORD nLength;\r
282                 WCHAR achString[];\r
283         };\r
284 #pragma warning(pop)    // C4200\r
285 \r
286         static int LoadStringEx(HINSTANCE hInstance, UINT uID, LPTSTR lpBuffer, int nBufferMax, WORD wLanguage);\r
287         static git_error_t* cancel(void *baton);\r
288 \r
289         // A sorted list of filenames (in Git format, in lowercase) \r
290         // when this list is set, we only pick-up files during a GetStatus which are found in this list\r
291         typedef std::vector<std::string> StdStrAVector;\r
292         StdStrAVector m_filterFileList;\r
293 };\r
294 \r
295 \r
296