OSDN Git Service

fixed issues with status (and icon overlays) in root directories
[tortoisegit/TortoiseGitJp.git] / src / Git / GitAdminDir.cpp
1 // TortoiseGit - a Windows shell extension for easy version control\r
2 \r
3 // Copyright (C) 2003-2008 - TortoiseGit\r
4 \r
5 // This program is free software; you can redistribute it and/or\r
6 // modify it under the terms of the GNU General Public License\r
7 // as published by the Free Software Foundation; either version 2\r
8 // of the License, or (at your option) any later version.\r
9 \r
10 // This program is distributed in the hope that it will be useful,\r
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of\r
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
13 // GNU General Public License for more details.\r
14 \r
15 // You should have received a copy of the GNU General Public License\r
16 // along with this program; if not, write to the Free Software Foundation,\r
17 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\r
18 #include "StdAfx.h"\r
19 #include "UnicodeUtils.h"\r
20 #include "GitAdminDir.h"\r
21 \r
22 GitAdminDir g_GitAdminDir;\r
23 \r
24 GitAdminDir::GitAdminDir()\r
25         : m_nInit(0)\r
26 //      , m_bVSNETHack(false)\r
27 //      , m_pool(NULL)\r
28 {\r
29 }\r
30 \r
31 GitAdminDir::~GitAdminDir()\r
32 {\r
33 //      if (m_nInit)\r
34 //               (m_pool);\r
35 }\r
36 \r
37 bool GitAdminDir::Init()\r
38 {\r
39         if (m_nInit==0)\r
40         {\r
41 #if 0   \r
42                 m_bVSNETHack = false;\r
43                 m_pool = svn_pool_create(NULL);\r
44                 size_t ret = 0;\r
45                 getenv_s(&ret, NULL, 0, "GIT_ASP_DOT_NET_HACK");\r
46                 if (ret)\r
47                 {\r
48                         svn_error_clear(svn_wc_set_adm_dir("_git", m_pool));\r
49                         m_bVSNETHack = true;\r
50                 }\r
51 #endif\r
52         }\r
53         m_nInit++;\r
54         return true;\r
55 }\r
56 \r
57 bool GitAdminDir::Close()\r
58 {\r
59         m_nInit--;\r
60         if (m_nInit>0)\r
61                 return false;\r
62 #if 0\r
63         svn_pool_destroy(m_pool);\r
64 #endif\r
65         return true;\r
66 }\r
67 \r
68 CString GitAdminDir::GetSuperProjectRoot(const CString& path) \r
69 {\r
70         CString projectroot=path;\r
71                 \r
72         do\r
73         {\r
74                 if(PathFileExists(projectroot + _T("\\.gitmodules")))\r
75                 {\r
76                         return projectroot;\r
77                 }               \r
78                 \r
79                 projectroot = projectroot.Left(projectroot.ReverseFind('\\'));\r
80 \r
81         }while(projectroot.ReverseFind('\\')>0);\r
82 \r
83         return _T("");\r
84 \r
85 }\r
86 \r
87 bool GitAdminDir::IsAdminDirName(const CString& name) const\r
88 {\r
89 #if 0\r
90         CStringA nameA = CUnicodeUtils::GetUTF8(name).MakeLower();\r
91         return !!svn_wc_is_adm_dir(nameA, m_pool);\r
92 #endif\r
93         return name == ".git";\r
94 }\r
95 CString GitAdminDir::GetGitTopDir(const CString& path) \r
96 {\r
97         CString str;\r
98         str=_T("");\r
99         HasAdminDir(path,!!PathIsDirectory(path),&str);\r
100         return str;\r
101 }\r
102 \r
103 bool GitAdminDir::HasAdminDir(const CString& path) const\r
104 {\r
105         return HasAdminDir(path, !!PathIsDirectory(path));\r
106 }\r
107 \r
108 bool GitAdminDir::HasAdminDir(const CString& path,CString *ProjectTopDir) const\r
109 {\r
110         return HasAdminDir(path, !!PathIsDirectory(path),ProjectTopDir);\r
111 }\r
112 \r
113 bool GitAdminDir::HasAdminDir(const CString& path, bool bDir,CString *ProjectTopDir) const\r
114 {\r
115         if (path.IsEmpty())\r
116                 return false;\r
117         bool bHasAdminDir = false;\r
118         CString sDirName = path;\r
119         if (!bDir)\r
120         {\r
121                 sDirName = path.Left(path.ReverseFind(_T('\\')));\r
122         }\r
123         \r
124         // a .git dir or anything inside it should be left out, only interested in working copy files -- Myagi\r
125         {\r
126         int n = 0;\r
127         for (;;)\r
128         {\r
129                 n = sDirName.Find(_T("\\.git"), n);\r
130                 if (n < 0)\r
131                 {\r
132                         break;\r
133                 }\r
134 \r
135                 // check for actual .git dir (and not .gitignore or something else), continue search if false match\r
136                 n += 5;\r
137                 if (sDirName[n] == _T('\\') || sDirName[n] == 0)\r
138                 {\r
139                         return false;\r
140                 }\r
141         }\r
142         }\r
143 \r
144         for (;;)\r
145         {\r
146                 if(PathFileExists(sDirName + _T("\\.git")))\r
147                 {\r
148                         if(ProjectTopDir)\r
149                         {\r
150                                 *ProjectTopDir=sDirName;\r
151                                 // Make sure to add the trailing slash to root paths such as 'C:'\r
152                                 if (sDirName.GetLength() == 2 && sDirName[1] == _T(':'))\r
153                                         (*ProjectTopDir) += _T("\\");\r
154                         }\r
155                         return true;\r
156                 }\r
157 \r
158                 int x = sDirName.ReverseFind(_T('\\'));\r
159                 if (x < 2)\r
160                         break;\r
161 \r
162                 sDirName = sDirName.Left(x);\r
163         }\r
164 \r
165         return false;\r
166         \r
167 }\r
168 \r
169 bool GitAdminDir::IsAdminDirPath(const CString& path) const\r
170 {\r
171         if (path.IsEmpty())\r
172                 return false;\r
173         bool bIsAdminDir = false;\r
174         CString lowerpath = path;\r
175         lowerpath.MakeLower();\r
176         int ind = -1;\r
177         int ind1 = 0;\r
178         while ((ind1 = lowerpath.Find(_T("\\.git"), ind1))>=0)\r
179         {\r
180                 ind = ind1++;\r
181                 if (ind == (lowerpath.GetLength() - 5))\r
182                 {\r
183                         bIsAdminDir = true;\r
184                         break;\r
185                 }\r
186                 else if (lowerpath.Find(_T("\\.git\\"), ind)>=0)\r
187                 {\r
188                         bIsAdminDir = true;\r
189                         break;\r
190                 }\r
191         }\r
192 \r
193         return bIsAdminDir;\r
194 }\r
195 \r