1 // TortoiseGit - a Windows shell extension for easy version control
3 // Copyright (C) 2008-2010 - TortoiseGit
5 // This program is free software; you can redistribute it and/or
6 // modify it under the terms of the GNU General Public License
7 // as published by the Free Software Foundation; either version 2
8 // of the License, or (at your option) any later version.
10 // This program is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 // GNU General Public License for more details.
15 // You should have received a copy of the GNU General Public License
16 // along with this program; if not, write to the Free Software Foundation,
17 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20 #include "UnicodeUtils.h"
21 #include "GitAdminDir.h"
23 GitAdminDir g_GitAdminDir
;
25 GitAdminDir::GitAdminDir()
27 // , m_bVSNETHack(false)
32 GitAdminDir::~GitAdminDir()
38 bool GitAdminDir::Init()
44 m_pool
= svn_pool_create(NULL
);
46 getenv_s(&ret
, NULL
, 0, "GIT_ASP_DOT_NET_HACK");
49 svn_error_clear(svn_wc_set_adm_dir("_git", m_pool
));
58 bool GitAdminDir::Close()
64 svn_pool_destroy(m_pool
);
69 CString
GitAdminDir::GetSuperProjectRoot(const CString
& path
)
71 CString projectroot
=path
;
75 if(CGit::GitPathFileExists(projectroot
+ _T("\\.gitmodules")))
80 projectroot
= projectroot
.Left(projectroot
.ReverseFind('\\'));
82 }while(projectroot
.ReverseFind('\\')>0);
88 bool GitAdminDir::IsAdminDirName(const CString
& name
) const
91 CStringA nameA
= CUnicodeUtils::GetUTF8(name
).MakeLower();
92 return !!svn_wc_is_adm_dir(nameA
, m_pool
);
94 return name
== ".git";
96 CString
GitAdminDir::GetGitTopDir(const CString
& path
)
100 HasAdminDir(path
,!!PathIsDirectory(path
),&str
);
104 bool GitAdminDir::HasAdminDir(const CString
& path
) const
106 return HasAdminDir(path
, !!PathIsDirectory(path
));
109 bool GitAdminDir::HasAdminDir(const CString
& path
,CString
*ProjectTopDir
) const
111 return HasAdminDir(path
, !!PathIsDirectory(path
),ProjectTopDir
);
114 bool GitAdminDir::HasAdminDir(const CString
& path
, bool bDir
,CString
*ProjectTopDir
) const
118 CString sDirName
= path
;
121 sDirName
= path
.Left(path
.ReverseFind(_T('\\')));
124 // a .git dir or anything inside it should be left out, only interested in working copy files -- Myagi
129 n
= sDirName
.Find(_T("\\.git"), n
);
135 // check for actual .git dir (and not .gitignore or something else), continue search if false match
137 if (sDirName
[n
] == _T('\\') || sDirName
[n
] == 0)
146 if(CGit::GitPathFileExists(sDirName
+ _T("\\.git")))
150 *ProjectTopDir
=sDirName
;
151 // Make sure to add the trailing slash to root paths such as 'C:'
152 if (sDirName
.GetLength() == 2 && sDirName
[1] == _T(':'))
153 (*ProjectTopDir
) += _T("\\");
158 int x
= sDirName
.ReverseFind(_T('\\'));
162 sDirName
= sDirName
.Left(x
);
169 bool GitAdminDir::IsAdminDirPath(const CString
& path
) const
173 bool bIsAdminDir
= false;
174 CString lowerpath
= path
;
175 lowerpath
.MakeLower();
178 while ((ind1
= lowerpath
.Find(_T("\\.git"), ind1
))>=0)
181 if (ind
== (lowerpath
.GetLength() - 5))
186 else if (lowerpath
.Find(_T("\\.git\\"), ind
)>=0)
196 bool GitAdminDir::IsBareRepo(const CString
& path
) const
201 if (IsAdminDirPath(path
))
204 if (!PathFileExists(path
+ _T("\\HEAD")) || !PathFileExists(path
+ _T("\\config")))
207 if (!PathFileExists(path
+ _T("\\objects\\")) || !PathFileExists(path
+ _T("\\refs\\")))