5 #include "registry.h"
\r
6 #include "GitConfig.h"
\r
8 #include "UnicodeUtils.h"
\r
9 #include "TGitPath.h"
\r
10 #include "gitindex.h"
\r
11 #include <sys/types.h>
\r
12 #include <sys/stat.h>
\r
14 #define FILL_DATA() \
\r
15 m_FileName.Empty();\
\r
16 g_Git.StringAppend(&m_FileName,(BYTE*)entry->name,CP_ACP,Big2lit(entry->flags)&CE_NAMEMASK);\
\r
17 m_FileName.Replace(_T('/'),_T('\\'));\
\r
18 this->m_Flags=Big2lit(entry->flags);\
\r
19 this->m_ModifyTime=Big2lit(entry->mtime.sec);
\r
21 int CGitIndex::FillData(ondisk_cache_entry * entry)
\r
27 int CGitIndex::FillData(ondisk_cache_entry_extended * entry)
\r
30 this->m_Flags |= ((int)Big2lit(entry->flags2))<<16;
\r
34 CGitIndexList::CGitIndexList()
\r
36 this->m_LastModifyTime=0;
\r
39 int CGitIndexList::ReadIndex(CString IndexFile)
\r
43 BYTE *buffer=NULL,*p;
\r
51 this->m_Map.clear();
\r
53 hfile = CreateFile(IndexFile,
\r
58 FILE_ATTRIBUTE_NORMAL,
\r
62 if(hfile == INVALID_HANDLE_VALUE)
\r
68 cache_header *header;
\r
69 DWORD size=0,filesize=0;
\r
71 filesize=GetFileSize(hfile,NULL);
\r
73 if(filesize == INVALID_FILE_SIZE )
\r
79 buffer = new BYTE[filesize];
\r
86 if(! ReadFile( hfile, buffer,filesize,&size,NULL) )
\r
88 ret = GetLastError();
\r
92 if (size != filesize)
\r
97 header = (cache_header *) buffer;
\r
98 if( Big2lit(header->hdr_signature) != CACHE_SIGNATURE )
\r
103 p+= sizeof(cache_header);
\r
105 int entries = Big2lit(header->hdr_entries);
\r
106 for(int i=0;i<entries;i++)
\r
108 ondisk_cache_entry *entry;
\r
109 ondisk_cache_entry_extended *entryex;
\r
110 entry=(ondisk_cache_entry*)p;
\r
111 entryex=(ondisk_cache_entry_extended*)p;
\r
112 int flags=Big2lit(entry->flags);
\r
113 if( flags & CE_EXTENDED)
\r
115 GitIndex.FillData(entryex);
\r
116 p+=ondisk_ce_size(entryex);
\r
120 GitIndex.FillData(entry);
\r
121 p+=ondisk_ce_size(entry);
\r
124 if(p>buffer+filesize)
\r
129 this->push_back(GitIndex);
\r
130 this->m_Map[GitIndex.m_FileName]=this->size()-1;
\r
139 if(hfile != INVALID_HANDLE_VALUE)
\r
140 CloseHandle(hfile);
\r
146 int CGitIndexList::GetFileStatus(CString &gitdir,CString &path,git_wc_status_kind *status,struct __stat64 &buf,FIll_STATUS_CALLBACK callback,void *pData)
\r
151 if(m_Map.find(path) == m_Map.end() )
\r
153 *status = git_wc_status_unversioned;
\r
156 int index = m_Map[path];
\r
159 if(index >= size() )
\r
162 if( buf.st_mtime == at(index).m_ModifyTime )
\r
164 *status = git_wc_status_normal;
\r
167 *status = git_wc_status_modified;
\r
170 if(at(index).m_Flags & CE_STAGEMASK )
\r
171 *status = git_wc_status_conflicted;
\r
172 else if(at(index).m_Flags & CE_INTENT_TO_ADD)
\r
173 *status = git_wc_status_added;
\r
177 callback(gitdir+_T("\\")+path,*status,pData);
\r
182 int CGitIndexList::GetStatus(CString &gitdir,CString &path, git_wc_status_kind *status,
\r
183 BOOL IsFull, BOOL IsRecursive,
\r
184 FIll_STATUS_CALLBACK callback,void *pData)
\r
187 struct __stat64 buf;
\r
188 git_wc_status_kind dirstatus = git_wc_status_none;
\r
192 result = _tstat64( gitdir, &buf );
\r
194 result = _tstat64( gitdir+_T("\\")+path, &buf );
\r
199 if(buf.st_mode & _S_IFDIR)
\r
201 if(!path.IsEmpty())
\r
203 if( path.Right(1) != _T("\\"))
\r
206 int len =path.GetLength();
\r
208 for(int i=0;i<size();i++)
\r
210 if( at(i).m_FileName.GetLength() > len )
\r
212 if(at(i).m_FileName.Left(len) == path)
\r
216 *status = git_wc_status_normal;
\r
218 callback(gitdir+_T("\\")+path,*status,pData);
\r
223 result = _tstat64( gitdir+_T("\\")+at(i).m_FileName, &buf );
\r
227 *status = git_wc_status_none;
\r
228 GetFileStatus(gitdir,at(i).m_FileName,status,buf,callback,pData);
\r
229 if( *status != git_wc_status_none )
\r
231 if( dirstatus == git_wc_status_none)
\r
233 dirstatus = git_wc_status_normal;
\r
235 if( *status != git_wc_status_normal )
\r
237 dirstatus = git_wc_status_modified;
\r
246 if( dirstatus != git_wc_status_none )
\r
248 *status = dirstatus;
\r
252 *status = git_wc_status_unversioned;
\r
255 callback(gitdir+_T("\\")+path,*status,pData);
\r
261 GetFileStatus(gitdir,path,status,buf,callback,pData);
\r
267 int CGitIndexFileMap::GetFileStatus(CString &gitdir, CString &path, git_wc_status_kind *status,BOOL IsFull, BOOL IsRecursive,
\r
268 FIll_STATUS_CALLBACK callback,void *pData)
\r
270 struct __stat64 buf;
\r
275 IndexFile=gitdir+_T("\\.git\\index");
\r
276 /* Get data associated with "crt_stat.c": */
\r
277 result = _tstat64( IndexFile, &buf );
\r
279 // WIN32_FILE_ATTRIBUTE_DATA FileInfo;
\r
280 // GetFileAttributesEx(_T("D:\\tortoisegit\\src\\gpl.txt"),GetFileExInfoStandard,&FileInfo);
\r
281 // result = _tstat64( _T("D:\\tortoisegit\\src\\gpl.txt"), &buf );
\r
286 if((*this)[IndexFile].m_LastModifyTime != buf.st_mtime )
\r
288 if((*this)[IndexFile].ReadIndex(IndexFile))
\r
291 (*this)[IndexFile].m_LastModifyTime = buf.st_mtime;
\r
293 (*this)[IndexFile].GetStatus(gitdir,path,status,IsFull,IsRecursive,callback,pData);
\r