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

shellext: drop dirstate cache entries if stat fails

Changeset b42454569f06

Parent dbb7d7a6ea5f

by Adrian Buehlmann

Changes to one file · Browse files at b42454569f06 Showing diff from parent dbb7d7a6ea5f Diff from another changeset...

 
31
32
33
34
35
36
37
38
39
40
41
 
 
 
 
 
42
43
44
 
 
 
 
 
 
 
 
45
46
47
 
 
48
49
50
51
 
52
53
54
55
56
 
57
58
59
60
61
62
63
64
65
66
67
 
68
69
70
71
 
 
 
 
72
73
74
75
76
 
77
78
79
80
81
 
82
83
84
85
86
87
88
89
90
 
 
 
 
 
 
 
91
92
93
94
95
96
97
 
 
 
 
 
 
 
 
98
99
 
 
 
 
 
 
 
 
 
 
100
101
 
31
32
33
 
34
35
36
37
38
39
 
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
 
58
59
60
61
62
63
64
65
66
67
68
 
69
70
71
 
 
 
 
 
 
 
 
 
72
73
74
75
76
77
78
79
80
81
82
83
 
84
85
86
87
 
 
 
88
89
 
 
 
 
 
 
 
 
90
91
92
93
94
95
96
97
 
 
 
 
 
 
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
@@ -31,71 +31,89 @@
  static std::list<Dirstatecache::E> _cache;     Iter iter = _cache.begin(); -   for (;iter != _cache.end(); ++iter)   {   if (hgroot == iter->hgroot)   break;   }   - bool isnew = false; + Winstat stat; + std::string path = hgroot + "\\.hg\\dirstate"; + + unsigned tc = GetTickCount(); + bool new_stat = false;     if (iter == _cache.end())   { + if (stat.lstat(path.c_str()) != 0) + { + TDEBUG_TRACE("Dirstatecache::get: lstat(" << path <<") failed"); + return 0; + } + TDEBUG_TRACE("Dirstatecache::get: lstat(" << path <<") ok "); + new_stat = true; +   if (_cache.size() >= 10)   { - TDEBUG_TRACE("Dirstatecache::get: dropping " << _cache.back().hgroot); + TDEBUG_TRACE("Dirstatecache::get: dropping " + << _cache.back().hgroot);   delete _cache.back().dstate;   _cache.back().dstate = 0;   _cache.pop_back();   } +   E e;   e.hgroot = hgroot;   _cache.push_front(e);   iter = _cache.begin(); - isnew = true; + iter->tickcount = tc;   }   - unsigned tc = GetTickCount(); - - std::string path = hgroot + "\\.hg\\dirstate"; - - Winstat stat; - - bool stat_done = false; - - if (isnew || (tc - iter->tickcount) > 500) + if (!new_stat && tc - iter->tickcount > 500)   {   if (0 != stat.lstat(path.c_str()))   {   TDEBUG_TRACE("Dirstatecache::get: lstat(" << path <<") failed"); + TDEBUG_TRACE("Dirstatecache::get: dropping " << iter->hgroot); + delete iter->dstate; + iter->dstate = 0; + _cache.erase(iter);   return 0;   }   iter->tickcount = tc; - stat_done = true;   TDEBUG_TRACE("Dirstatecache::get: lstat(" << path <<") ok "); + new_stat = true;   }   - if ( stat_done && - (iter->dstate_mtime != stat.mtime - || iter->dstate_size != stat.size) ) + if (iter->dstate)   { - iter->dstate_mtime = stat.mtime; - iter->dstate_size = stat.size; - if (iter->dstate) { - delete iter->dstate; - iter->dstate = 0; - TDEBUG_TRACE("Dirstatecache::get: refreshing " << hgroot); - } else { - TDEBUG_TRACE("Dirstatecache::get: reading " << hgroot); + if (!new_stat) + return iter->dstate; + + if (iter->dstate_mtime == stat.mtime + && iter->dstate_size == stat.size) + { + return iter->dstate;   } - unsigned tc0 = GetTickCount(); - iter->dstate = Dirstate::read(path).release(); - unsigned tc1 = GetTickCount(); - unsigned delta = tc1 - tc0; - TDEBUG_TRACE("Dirstatecache::get: read done in " << delta << " ticks, " - << _cache.size() << " repos in cache"); + + TDEBUG_TRACE("Dirstatecache::get: refreshing " << hgroot); + delete iter->dstate; + iter->dstate = 0; + } + else + { + TDEBUG_TRACE("Dirstatecache::get: reading " << hgroot);   }   + unsigned tc0 = GetTickCount(); + iter->dstate = Dirstate::read(path).release(); + unsigned tc1 = GetTickCount(); + unsigned delta = tc1 - tc0; + TDEBUG_TRACE("Dirstatecache::get: read done in " << delta << " ticks, " + << _cache.size() << " repos in cache"); + + iter->dstate_mtime = stat.mtime; + iter->dstate_size = stat.size; +   return iter->dstate;  }