void EvalFMode(const void *data, qCtx *ctx, qStr *out, qArgAry *args) { VALID_ARGC("fmtime", 0, 0); DIRSTATE *state = (DIRSTATE *) data; if (GetDirStatus(state)) { out->PutN((int)state->data.st_mode); } }
void GitStatus::GetStatus(const CTGitPath& path, bool /*update*/ /* = false */, bool noignore /* = false */, bool /*noexternals*/ /* = false */) { // NOTE: unlike the SVN version this one does not cache the enumerated files, because in practice no code in all of // Tortoise uses this, all places that call GetStatus create a temp GitStatus object which gets destroyed right // after the call again CString sProjectRoot; if ( !path.HasAdminDir(&sProjectRoot) ) return; bool isfull = ((DWORD)CRegStdDWORD(_T("Software\\TortoiseGit\\CacheType"), GetSystemMetrics(SM_REMOTESESSION) ? ShellCache::dll : ShellCache::exe) == ShellCache::dllFull); int err = 0; { LPCTSTR lpszSubPath = NULL; CString sSubPath; CString s = path.GetWinPathString(); if (s.GetLength() > sProjectRoot.GetLength()) { sSubPath = s.Right(s.GetLength() - sProjectRoot.GetLength()); lpszSubPath = sSubPath; // skip initial slash if necessary if (*lpszSubPath == _T('\\')) ++lpszSubPath; } m_status.prop_status = m_status.text_status = git_wc_status_none; m_status.assumeValid = false; m_status.skipWorktree = false; if(path.IsDirectory()) { err = GetDirStatus(sProjectRoot,lpszSubPath,&m_status.text_status , isfull, false,!noignore, NULL, NULL); if (m_status.text_status == git_wc_status_added || m_status.text_status == git_wc_status_deleted) // fix for issue #1769; a folder is either modified, conflicted or normal m_status.text_status = git_wc_status_modified; } else { err = GetFileStatus(sProjectRoot, lpszSubPath, &m_status.text_status ,isfull, false,!noignore, NULL,NULL, &m_status.assumeValid, &m_status.skipWorktree); } } // Error present if function is not under version control if (err) { status = NULL; return; } status = &m_status; }
void EvalFIsDir(const void *data, qCtx *ctx, qStr *out, qArgAry *args) { VALID_ARGC("isdir", 0, 0); DIRSTATE *state = (DIRSTATE *) data; #ifdef WIN32 if((int)state->data.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY) #else if (GetDirStatus(state) && S_ISDIR(state->data.st_mode)) #endif out->PutC('T'); }
void EvalFAttr(const void *data, qCtx *ctx, qStr *out, qArgAry *args) { VALID_ARGC("fattr", 0, 0); DIRSTATE *state = (DIRSTATE *) data; #ifdef WIN32 out->PutN((int)state->data.dwFileAttributes); #else if (GetDirStatus(state)) { out->PutN((int)state->data.st_mode); } #endif }
// static method git_wc_status_kind GitStatus::GetAllStatus(const CTGitPath& path, git_depth_t depth) { git_wc_status_kind statuskind; // git_client_ctx_t * ctx; // apr_pool_t * pool; // git_error_t * err; BOOL err; BOOL isDir; CString sProjectRoot; isDir = path.IsDirectory(); if (!path.HasAdminDir(&sProjectRoot)) return git_wc_status_none; // pool = git_pool_create (NULL); // create the memory pool // git_error_clear(git_client_create_context(&ctx, pool)); // git_revnum_t youngest = Git_INVALID_REVNUM; // git_opt_revision_t rev; // rev.kind = git_opt_revision_unspecified; statuskind = git_wc_status_none; const BOOL bIsRecursive = (depth == git_depth_infinity || depth == git_depth_unknown); // taken from SVN source CString sSubPath; CString s = path.GetWinPathString(); if (s.GetLength() > sProjectRoot.GetLength()) { if (sProjectRoot.GetLength() == 3 && sProjectRoot[1] == _T(':')) sSubPath = s.Right(s.GetLength() - sProjectRoot.GetLength()); else sSubPath = s.Right(s.GetLength() - sProjectRoot.GetLength() - 1/*otherwise it gets initial slash*/); } bool isfull = ((DWORD)CRegStdDWORD(_T("Software\\TortoiseGit\\CacheType"), GetSystemMetrics(SM_REMOTESESSION) ? ShellCache::dll : ShellCache::exe) == ShellCache::dllFull); if(isDir) { err = GetDirStatus(sProjectRoot,sSubPath,&statuskind, isfull,bIsRecursive,isfull,NULL, NULL); } else { err = GetFileStatus(sProjectRoot,sSubPath,&statuskind,isfull, false,isfull, NULL,NULL); } return statuskind; }
void EvalFCtime(const void *data, qCtx *ctx, qStr *out, qArgAry *args) { VALID_ARGC("fctime", 0, 0); DIRSTATE *state = (DIRSTATE *) data; #ifdef WIN32 if (state->data.ftCreationTime.dwLowDateTime>0) { out->PutN(ConvWin32Time(state->data.ftCreationTime)); } #else if (GetDirStatus(state)) { out->PutN((int)state->data.st_ctime); } #endif }
void EvalFSize(const void *data, qCtx *ctx, qStr *out, qArgAry *args) { VALID_ARGC("fsize", 0, 0); DIRSTATE *state = (DIRSTATE *) data; #ifdef WIN32 if (state->data.nFileSizeHigh) out->PutN((double) state->data.nFileSizeHigh * (double) MAXDWORD + (double) state->data.nFileSizeLow); else out->PutN((unsigned int)state->data.nFileSizeLow); #else if (GetDirStatus(state)) { out->PutN((int)state->data.st_size); } #endif }
// static method git_wc_status_kind GitStatus::GetAllStatus(const CTGitPath& path, git_depth_t depth, bool * assumeValid, bool * skipWorktree) { git_wc_status_kind statuskind; BOOL err; BOOL isDir; CString sProjectRoot; isDir = path.IsDirectory(); if (!path.HasAdminDir(&sProjectRoot)) return git_wc_status_none; // rev.kind = git_opt_revision_unspecified; statuskind = git_wc_status_none; const BOOL bIsRecursive = (depth == git_depth_infinity || depth == git_depth_unknown); // taken from SVN source CString sSubPath; CString s = path.GetWinPathString(); if (s.GetLength() > sProjectRoot.GetLength()) { if (sProjectRoot.GetLength() == 3 && sProjectRoot[1] == _T(':')) sSubPath = s.Right(s.GetLength() - sProjectRoot.GetLength()); else sSubPath = s.Right(s.GetLength() - sProjectRoot.GetLength() - 1/*otherwise it gets initial slash*/); } bool isfull = ((DWORD)CRegStdDWORD(_T("Software\\TortoiseGit\\CacheType"), GetSystemMetrics(SM_REMOTESESSION) ? ShellCache::dll : ShellCache::exe) == ShellCache::dllFull); if(isDir) { err = GetDirStatus(sProjectRoot,sSubPath,&statuskind, isfull,bIsRecursive,isfull,NULL, NULL); // folders must not be displayed as added or deleted only as modified (this is for Shell Overlay-Modes) if (statuskind == git_wc_status_unversioned && sSubPath.IsEmpty()) statuskind = git_wc_status_normal; else if (statuskind == git_wc_status_deleted || statuskind == git_wc_status_added) statuskind = git_wc_status_modified; } else { err = GetFileStatus(sProjectRoot, sSubPath, &statuskind, isfull, false, isfull, NULL, NULL, assumeValid, skipWorktree); } return statuskind; }
git_revnum_t GitStatus::GetStatus(const CTGitPath& path, bool update /* = false */, bool noignore /* = false */, bool /*noexternals*/ /* = false */) { // NOTE: unlike the SVN version this one does not cache the enumerated files, because in practice no code in all of // Tortoise uses this, all places that call GetStatus create a temp GitStatus object which gets destroyed right // after the call again // apr_hash_t * statushash; // apr_hash_t * exthash; // apr_array_header_t * statusarray; // const sort_item* item; // git_error_clear(m_err); // statushash = apr_hash_make(m_pool); // exthash = apr_hash_make(m_pool); git_revnum_t youngest = GIT_INVALID_REVNUM; // git_opt_revision_t rev; // rev.kind = git_opt_revision_unspecified; CString sProjectRoot; if ( !path.HasAdminDir(&sProjectRoot) ) return youngest; struct hashbaton_t hashbaton; // hashbaton.hash = statushash; // hashbaton.exthash = exthash; hashbaton.pThis = this; bool isfull = ((DWORD)CRegStdDWORD(_T("Software\\TortoiseGit\\CacheType"), GetSystemMetrics(SM_REMOTESESSION) ? ShellCache::dll : ShellCache::exe) == ShellCache::dllFull); { LPCTSTR lpszSubPath = NULL; CString sSubPath; CString s = path.GetWinPathString(); if (s.GetLength() > sProjectRoot.GetLength()) { sSubPath = s.Right(s.GetLength() - sProjectRoot.GetLength()); lpszSubPath = sSubPath; // skip initial slash if necessary if (*lpszSubPath == _T('\\')) lpszSubPath++; } m_status.prop_status = m_status.text_status = git_wc_status_none; if(path.IsDirectory()) { m_err = GetDirStatus(sProjectRoot,CString(lpszSubPath),&m_status.text_status , isfull, false,!noignore, NULL, NULL); } else { m_err = GetFileStatus(sProjectRoot,CString(lpszSubPath),&m_status.text_status ,isfull, false,!noignore, NULL,NULL); } } // Error present if function is not under version control if (m_err) /*|| (apr_hash_count(statushash) == 0)*/ { status = NULL; return GIT_INVALID_REVNUM; } // Convert the unordered hash to an ordered, sorted array /*statusarray = sort_hash (statushash, sort_compare_items_as_paths, m_pool);*/ // only the first entry is needed (no recurse) // item = &APR_ARRAY_IDX (statusarray, 0, const sort_item); // status = (git_wc_status2_t *) item->value; status = &m_status; if (update) { // done to match TSVN functionality of this function (not sure if any code uses the reutrn val) // if TGit does not need this, then change the return type of function youngest = g_Git.GetHash(_T("HEAD")); } return youngest; }