Kiln » TortoiseHg » TortoiseHg
Clone URL:  
Pushed to one repository · View In Graph Contained in 0.8, 0.8.1, and 0.8.2

dirstate: reintroduce HgQueryDirstate() as a common wrapper

Moving the directory vs. file check from IconOverlay.cpp into HgQueryDirstate()
in dirstate.cpp

Changeset 55964a9ffccd

Parent 17f59a6a892f

by Adrian Buehlmann

Changes to 3 files · Browse files at 55964a9ffccd Showing diff from parent 17f59a6a892f Diff from another changeset...

 
70
71
72
73
 
74
75
76
 
79
80
81
82
83
84
85
86
87
88
89
90
91
92
 
 
93
94
95
 
70
71
72
 
73
74
75
76
 
79
80
81
 
 
 
 
 
 
 
 
 
 
 
82
83
84
85
86
@@ -70,7 +70,7 @@
  offset++;   const char* relpathptr = path.c_str() + offset;   - std::string relpath = relpathptr; + const std::string relpath = relpathptr;     if (relpath.empty())   return S_FALSE; // don't show icon on repo root dir @@ -79,17 +79,8 @@
  return S_FALSE; // don't descend into .hg dir     char status = 0; - - if (PathIsDirectory(path.c_str())) - { - if (!HgQueryDirstateDirectory(hgroot, path, relpath, status)) - return S_FALSE; - } - else - { - if (!HgQueryDirstateFile(hgroot, path, relpath, status)) - return S_FALSE; - } + if (!HgQueryDirstate(hgroot, path, relpath, status)) + return S_FALSE;     if (myTortoiseClass == TORTOISE_OLE_ADDED && status == 'A')   return S_OK;
 
18
19
20
 
 
21
22
23
 
245
246
247
248
249
 
 
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
 
312
313
314
315
316
317
 
 
 
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
 
351
352
353
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
354
355
356
 
18
19
20
21
22
23
24
25
 
247
248
249
 
 
250
251
252
253
 
 
 
 
 
 
 
 
 
 
 
 
 
254
255
256
 
301
302
303
 
 
 
304
305
306
307
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
308
309
310
 
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
@@ -18,6 +18,8 @@
   #include "dirstate.h"   +#include <shlwapi.h> +  #include <vector>  #include <list>  #include <deque> @@ -245,23 +247,10 @@
 }     -int HgQueryDirstateDirectory( - const std::string& hgroot, const std::string& abspath, +static int HgQueryDirstateDirectory( + const std::string& hgroot, const dirstate* pd,   std::string& relpath, char& outStatus)  { - const dirstate* pd = dirstatecache::get(hgroot); - if (!pd) - { - TDEBUG_TRACE("HgQueryDirstateDirectory: dirstatecache::get(" << hgroot << ") returns 0"); - return 0; - } - - for (size_t i = 0; i < relpath.size(); ++i) - { - if (relpath[i] == '\\') - relpath[i] = '/'; - } -   bool added = false;   bool modified = false;   bool empty = true; @@ -312,30 +301,10 @@
 }     -int HgQueryDirstateFile( - const std::string& hgroot, const std::string& abspath, - std::string& relpath, char& outStatus) +static int HgQueryDirstateFile( + const dirstate* pd, std::string& relpath, + const struct _stat& stat, char& outStatus)  { - struct _stat stat; - if (0 != lstat(abspath.c_str(), stat)) - { - TDEBUG_TRACE("HgQueryDirstateFile: lstat(" << abspath << ") fails"); - return 0; - } - - const dirstate* pd = dirstatecache::get(hgroot); - if (!pd) - { - TDEBUG_TRACE("HgQueryDirstateFile: dirstatecache::get(" << hgroot << ") returns 0"); - return 0; - } - - for (size_t i = 0; i < relpath.size(); ++i) - { - if (relpath[i] == '\\') - relpath[i] = '/'; - } -   for (dirstate::Iter iter = pd->begin(); iter != pd->end(); ++iter)   {   const direntry& e = *iter; @@ -351,6 +320,42 @@
 }     +int HgQueryDirstate( + const std::string& hgroot, const std::string& abspath, + const std::string& relpath_in, char& outStatus) +{ + struct _stat stat; + if (0 != lstat(abspath.c_str(), stat)) + { + TDEBUG_TRACE("HgQueryDirstate: lstat(" << abspath << ") fails"); + return 0; + } + + const dirstate* pd = dirstatecache::get(hgroot); + if (!pd) + { + TDEBUG_TRACE("HgQueryDirstate: dirstatecache::get(" << hgroot << ") returns 0"); + return 0; + } + + std::string relpath = relpath_in; + for (size_t i = 0; i < relpath.size(); ++i) + { + if (relpath[i] == '\\') + relpath[i] = '/'; + } + + int res = 0; + + if (PathIsDirectory(abspath.c_str())) + res = HgQueryDirstateDirectory(hgroot, pd, relpath, outStatus); + else + res = HgQueryDirstateFile(pd, relpath, stat, outStatus); + + return res; +} + +  static char *revhash_string(const char revhash[HASH_LENGTH])  {   unsigned ix;
 
3
4
5
6
 
7
8
9
10
11
12
 
13
14
 
3
4
5
 
6
7
 
 
 
 
 
8
9
10
@@ -3,12 +3,8 @@
   #include <string>   -int HgQueryDirstateFile( +int HgQueryDirstate(   const std::string& hgroot, const std::string& abspath, - std::string& relpath, char& outStatus); - -int HgQueryDirstateDirectory( - const std::string& hgroot, const std::string& abspath, - std::string& relpath, char& outStatus); + const std::string& relpath, char& outStatus);    #endif