1 // TortoiseGit - a Windows shell extension for easy version control
\r
3 // Copyright (C) 2003-2008 - TortoiseGit
\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
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
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
19 #include "UnicodeUtils.h"
\r
20 #include "GitAdminDir.h"
\r
22 GitAdminDir g_GitAdminDir;
\r
24 GitAdminDir::GitAdminDir()
\r
26 // , m_bVSNETHack(false)
\r
31 GitAdminDir::~GitAdminDir()
\r
37 bool GitAdminDir::Init()
\r
42 m_bVSNETHack = false;
\r
43 m_pool = svn_pool_create(NULL);
\r
45 getenv_s(&ret, NULL, 0, "GIT_ASP_DOT_NET_HACK");
\r
48 svn_error_clear(svn_wc_set_adm_dir("_git", m_pool));
\r
49 m_bVSNETHack = true;
\r
57 bool GitAdminDir::Close()
\r
63 svn_pool_destroy(m_pool);
\r
68 CString GitAdminDir::GetSuperProjectRoot(const CString& path)
\r
70 CString projectroot=path;
\r
74 if(PathFileExists(projectroot + _T("\\.gitmodules")))
\r
79 projectroot = projectroot.Left(projectroot.ReverseFind('\\'));
\r
81 }while(projectroot.ReverseFind('\\')>0);
\r
87 bool GitAdminDir::IsAdminDirName(const CString& name) const
\r
90 CStringA nameA = CUnicodeUtils::GetUTF8(name).MakeLower();
\r
91 return !!svn_wc_is_adm_dir(nameA, m_pool);
\r
93 return name == ".git";
\r
95 CString GitAdminDir::GetGitTopDir(const CString& path)
\r
99 HasAdminDir(path,!!PathIsDirectory(path),&str);
\r
103 bool GitAdminDir::HasAdminDir(const CString& path) const
\r
105 return HasAdminDir(path, !!PathIsDirectory(path));
\r
108 bool GitAdminDir::HasAdminDir(const CString& path,CString *ProjectTopDir) const
\r
110 return HasAdminDir(path, !!PathIsDirectory(path),ProjectTopDir);
\r
113 bool GitAdminDir::HasAdminDir(const CString& path, bool bDir,CString *ProjectTopDir) const
\r
115 if (path.IsEmpty())
\r
117 bool bHasAdminDir = false;
\r
118 CString sDirName = path;
\r
121 sDirName = path.Left(path.ReverseFind(_T('\\')));
\r
124 // a .git dir or anything inside it should be left out, only interested in working copy files -- Myagi
\r
129 n = sDirName.Find(_T("\\.git"), n);
\r
135 // check for actual .git dir (and not .gitignore or something else), continue search if false match
\r
137 if (sDirName[n] == _T('\\') || sDirName[n] == 0)
\r
146 if(PathFileExists(sDirName + _T("\\.git")))
\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
158 int x = sDirName.ReverseFind(_T('\\'));
\r
162 sDirName = sDirName.Left(x);
\r
169 bool GitAdminDir::IsAdminDirPath(const CString& path) const
\r
171 if (path.IsEmpty())
\r
173 bool bIsAdminDir = false;
\r
174 CString lowerpath = path;
\r
175 lowerpath.MakeLower();
\r
178 while ((ind1 = lowerpath.Find(_T("\\.git"), ind1))>=0)
\r
181 if (ind == (lowerpath.GetLength() - 5))
\r
183 bIsAdminDir = true;
\r
186 else if (lowerpath.Find(_T("\\.git\\"), ind)>=0)
\r
188 bIsAdminDir = true;
\r
193 return bIsAdminDir;
\r