OSDN Git Service

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