OSDN Git Service

Fix Issue 22 Error deleting file from context menu if filename contains spaces
[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 bool GitAdminDir::IsAdminDirName(const CString& name) const\r
69 {\r
70 #if 0\r
71         CStringA nameA = CUnicodeUtils::GetUTF8(name).MakeLower();\r
72         return !!svn_wc_is_adm_dir(nameA, m_pool);\r
73 #endif\r
74         return name == ".git";\r
75 }\r
76 CString GitAdminDir::GetGitTopDir(const CString& path) \r
77 {\r
78         CString str;\r
79         str=_T("");\r
80         HasAdminDir(path,!!PathIsDirectory(path),&str);\r
81         return str;\r
82 }\r
83 \r
84 bool GitAdminDir::HasAdminDir(const CString& path) const\r
85 {\r
86         return HasAdminDir(path, !!PathIsDirectory(path));\r
87 }\r
88 \r
89 bool GitAdminDir::HasAdminDir(const CString& path,CString *ProjectTopDir) const\r
90 {\r
91         return HasAdminDir(path, !!PathIsDirectory(path),ProjectTopDir);\r
92 }\r
93 \r
94 bool GitAdminDir::HasAdminDir(const CString& path, bool bDir,CString *ProjectTopDir) const\r
95 {\r
96         if (path.IsEmpty())\r
97                 return false;\r
98         bool bHasAdminDir = false;\r
99         CString sDirName = path;\r
100         if (!bDir)\r
101         {\r
102                 sDirName = path.Left(path.ReverseFind('\\'));\r
103         }\r
104         \r
105         // a .git dir or anything inside it should be left out, only interested in working copy files -- Myagi\r
106         {\r
107         int n = 0;\r
108         for (;;)\r
109         {\r
110                 n = sDirName.Find(_T("\\.git"), n);\r
111                 if (n < 0)\r
112                 {\r
113                         break;\r
114                 }\r
115 \r
116                 // check for actual .git dir (and not .gitignore or something else), continue search if false match\r
117                 n += 5;\r
118                 if (sDirName[n] == _T('\\') || sDirName[n] == 0)\r
119                 {\r
120                         return false;\r
121                 }\r
122         }\r
123         }\r
124 \r
125         do\r
126         {\r
127                 if(PathFileExists(sDirName + _T("\\.git")))\r
128                 {\r
129                         if(ProjectTopDir)\r
130                                 *ProjectTopDir=sDirName;\r
131                         return true;\r
132                 }\r
133                 sDirName = sDirName.Left(sDirName.ReverseFind('\\'));\r
134 \r
135         }while(sDirName.ReverseFind('\\')>0);\r
136 \r
137         return false;\r
138         \r
139 }\r
140 \r
141 bool GitAdminDir::IsAdminDirPath(const CString& path) const\r
142 {\r
143         if (path.IsEmpty())\r
144                 return false;\r
145         bool bIsAdminDir = false;\r
146         CString lowerpath = path;\r
147         lowerpath.MakeLower();\r
148         int ind = -1;\r
149         int ind1 = 0;\r
150         while ((ind1 = lowerpath.Find(_T("\\.git"), ind1))>=0)\r
151         {\r
152                 ind = ind1++;\r
153                 if (ind == (lowerpath.GetLength() - 5))\r
154                 {\r
155                         bIsAdminDir = true;\r
156                         break;\r
157                 }\r
158                 else if (lowerpath.Find(_T("\\.git\\"), ind)>=0)\r
159                 {\r
160                         bIsAdminDir = true;\r
161                         break;\r
162                 }\r
163         }\r
164 \r
165         return bIsAdminDir;\r
166 }\r
167 \r