<table><tr><td style="">rkflx added a comment.
</td><a style="text-decoration: none; padding: 4px 8px; margin: 0 8px 8px; float: right; color: #464C5C; font-weight: bold; border-radius: 3px; background-color: #F7F7F9; background-image: linear-gradient(to bottom,#fff,#f1f0f1); display: inline-block; border: 1px solid rgba(71,87,120,.2);" href="https://phabricator.kde.org/D7671" rel="noreferrer">View Revision</a></tr></table><br /><div><div><p>After further analysis, I can draw these conclusions (contradicting some assumptions from above, confirming others):</p>

<ol class="remarkup-list">
<li class="remarkup-list-item">KDirWatch correctly emits at least one "dirty" each for directory watches when files are created, modified, deleted or moved_to (i.e., KDirWatch is not the reason for the bug).</li>
<li class="remarkup-list-item">The directory code path in Okular only works for deleted files, but never works for moved files (that's the real reason for the bug).</li>
<li class="remarkup-list-item">The file code path in Okular would work, if KDirWatch emitted dirty for a file on move_to (but KDirWatch does not and should not).</li>
</ol>

<p>This can be shown as follows (separately for each conclusion):</p>

<ol class="remarkup-list">
<li class="remarkup-list-item">From kcoreaddons git repo, run <tt style="background: #ebebeb; font-size: 13px;">kdirwatchtest_gui</tt> and observe the dirwatch "Dirty (w1)", double check with <tt style="background: #ebebeb; font-size: 13px;">inotifywait -m .</tt>:<ul class="remarkup-list">
<li class="remarkup-list-item"><tt style="background: #ebebeb; font-size: 13px;">touch x</tt> → 1 observation with reported path set to "x" (attrib and close_write in one), 2 observations for "/" (1 create, for some reason resulting in 2 dirty emissions)</li>
<li class="remarkup-list-item"><tt style="background: #ebebeb; font-size: 13px;">touch x</tt> (again) → 1 observation for "x" (attrib and close_write in one)</li>
<li class="remarkup-list-item"><tt style="background: #ebebeb; font-size: 13px;">rm x</tt> → 1 observation for "/" (delete)</li>
<li class="remarkup-list-item"><tt style="background: #ebebeb; font-size: 13px;">touch ../x && mv ../x x</tt> → 2 observations for "/" (moved_to, 2 emissions for some reason)</li>
<li class="remarkup-list-item"><tt style="background: #ebebeb; font-size: 13px;">touch ../x && mv ../x x</tt> (again) → 2 observations for "/" (moved_to, 2 emissions for some reason)</li>
</ul></li>
</ol>

<ol class="remarkup-list" start="2">
<li class="remarkup-list-item">Set a breakpoint after <tt style="background: #ebebeb; font-size: 13px;">// Our parent has been dirtified</tt>, open x.txt in Okular, issue <tt style="background: #ebebeb; font-size: 13px;">touch ../x && mv ../x x.txt</tt> and step through the code block. Notice how the breakpoint is passed two times (see above), in both cases <tt style="background: #ebebeb; font-size: 13px;">m_fileWasRemoved</tt> is not being set to true (as the file still <tt style="background: #ebebeb; font-size: 13px;">::exists</tt>), resulting in skipping <tt style="background: #ebebeb; font-size: 13px;">m_dirtyHandler->start</tt> even though the file <tt style="background: #ebebeb; font-size: 13px;">::exists</tt> here too. IOW, no matter what triggers the directory watch, Okular uses a Qt function to check for file deletion which correctly reports the file still being there, so a reload is never triggered.</li>
</ol>

<ol class="remarkup-list" start="3">
<li class="remarkup-list-item">Apply <a href="https://phabricator.kde.org/D7671" style="background-color: #e7e7e7;
          border-color: #e7e7e7;
          border-radius: 3px;
          padding: 0 4px;
          font-weight: bold;
          color: black;text-decoration: line-through;" rel="noreferrer">D7671</a> and remove the directory watcher to simulate "dirty" on move_to for files. <tt style="background: #ebebeb; font-size: 13px;">touch ../x && mv ../x x.txt</tt> triggers reload of x.txt in Okular.</li>
</ol>

<p>Therefore, the only thing left to clarify in the docs for KDirWatch is the behaviour on move. E.g., currently for file watches a move_to results in "created" and "deleted", but not "dirty" (could be made more explicit). As the rest of the discussion is not Okular specific anymore, let's continue on kde-frameworks-devel.</p></div></div><br /><div><strong>REPOSITORY</strong><div><div>R223 Okular</div></div></div><br /><div><strong>REVISION DETAIL</strong><div><a href="https://phabricator.kde.org/D7671" rel="noreferrer">https://phabricator.kde.org/D7671</a></div></div><br /><div><strong>To: </strong>progwolff, aacid<br /><strong>Cc: </strong>sander, rkflx, Okular, aacid<br /></div>