Merge remote-tracking branch 'origin/Ghidra_12.0'

This commit is contained in:
ghidra1 2025-09-15 10:31:49 -04:00
commit c3d8571ba3
2 changed files with 29 additions and 35 deletions

View file

@ -4,9 +4,9 @@
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
* You may obtain a copy of the License at * You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@ -339,11 +339,7 @@ public class DefaultProjectDataTest extends AbstractGhidraHeadedIntegrationTest
sharedFS.createFolder("/", "b"); sharedFS.createFolder("/", "b");
flushFileSystemEvents(); // wait for FileSystemListener callback to update folder flushFileSystemEvents(); // wait for FileSystemListener callback to update folder
assertEquals(3, root.getFolders().length); assertEquals(3, root.getFolders().length);
assertEventsSize(3); assertEventsSize(0);
checkEvent(events.get(0), "Folder Added", null, "/a", null, null, null);
checkEvent(events.get(1), "Folder Added", null, "/b", null, null, null);
checkEvent(events.get(2), "Folder Added", null, "/c", null, null, null);
sharedFS.createFolder("/b", "subB"); sharedFS.createFolder("/b", "subB");
flushFileSystemEvents(); // wait for FileSystemListener callback to update folder flushFileSystemEvents(); // wait for FileSystemListener callback to update folder
@ -487,12 +483,9 @@ public class DefaultProjectDataTest extends AbstractGhidraHeadedIntegrationTest
root.getFolders(); // visit root folder to receive change events for it root.getFolders(); // visit root folder to receive change events for it
sharedFS.renameFolder("/", "a", "bigA"); sharedFS.renameFolder("/", "a", "bigA");
flushFileSystemEvents(); // wait for FileSystemListener callback to update folder flushFileSystemEvents(); // wait for FileSystemListener callback to update folder
assertEventsSize(4); assertEventsSize(1);
checkEvent(events.get(0), "Folder Added", null, "/a", null, null, null); checkEvent(events.get(0), "Folder Added", null, "/bigA", null, null, null);
checkEvent(events.get(1), "Folder Added", null, "/b", null, null, null);
checkEvent(events.get(2), "Folder Added", null, "/c", null, null, null);
checkEvent(events.get(3), "Folder Added", null, "/bigA", null, null, null);
// versioned folder was renamed to /bigA, but private folder /a should still exist // versioned folder was renamed to /bigA, but private folder /a should still exist
@ -516,11 +509,9 @@ public class DefaultProjectDataTest extends AbstractGhidraHeadedIntegrationTest
sharedFS.renameFolder("/a", "y", "bigY"); sharedFS.renameFolder("/a", "y", "bigY");
flushFileSystemEvents(); // wait for FileSystemListener callback to update folder flushFileSystemEvents(); // wait for FileSystemListener callback to update folder
assertEventsSize(4); assertEventsSize(2);
checkEvent(events.get(0), "Folder Added", null, "/a/x", null, null, null); checkEvent(events.get(0), "Folder Removed", "/a", null, null, null, "y");
checkEvent(events.get(1), "Folder Added", null, "/a/y", null, null, null); checkEvent(events.get(1), "Folder Added", null, "/a/bigY", null, null, null);
checkEvent(events.get(2), "Folder Removed", "/a", null, null, null, "y");
checkEvent(events.get(3), "Folder Added", null, "/a/bigY", null, null, null);
} }
@ -532,12 +523,9 @@ public class DefaultProjectDataTest extends AbstractGhidraHeadedIntegrationTest
assertNull(root.getFolder("c")); assertNull(root.getFolder("c"));
assertNotNull(root.getFolder("bigC")); assertNotNull(root.getFolder("bigC"));
assertEventsSize(5); assertEventsSize(2);
checkEvent(events.get(0), "Folder Added", null, "/a", null, null, null); checkEvent(events.get(0), "Folder Removed", "/", null, null, null, "c");
checkEvent(events.get(1), "Folder Added", null, "/b", null, null, null); checkEvent(events.get(1), "Folder Added", null, "/bigC", null, null, null);
checkEvent(events.get(2), "Folder Added", null, "/c", null, null, null);
checkEvent(events.get(3), "Folder Removed", "/", null, null, null, "c");
checkEvent(events.get(4), "Folder Added", null, "/bigC", null, null, null);
} }
@Test @Test
@ -614,12 +602,9 @@ public class DefaultProjectDataTest extends AbstractGhidraHeadedIntegrationTest
sharedFS.moveFolder("/", "a", "/c"); sharedFS.moveFolder("/", "a", "/c");
flushFileSystemEvents(); // wait for FileSystemListener callback to update folder flushFileSystemEvents(); // wait for FileSystemListener callback to update folder
assertEventsSize(4); assertEventsSize(1);
checkEvent(events.get(0), "Folder Added", null, "/a", null, null, null); checkEvent(events.get(0), "Folder Added", null, "/c/a", null, null, null);
checkEvent(events.get(1), "Folder Added", null, "/b", null, null, null);
checkEvent(events.get(2), "Folder Added", null, "/c", null, null, null);
checkEvent(events.get(3), "Folder Added", null, "/c/a", null, null, null);
// versioned folder was moved to /c/a, but private folder /a should still exist // versioned folder was moved to /c/a, but private folder /a should still exist

View file

@ -558,12 +558,14 @@ class GhidraFolderData {
} }
/** /**
* Refresh set of sub-folder names and identify added/removed folders. * Refresh set of sub-folder names and notify about adds/removes if appropriate
* @param recursive recurse into visited subfolders if true * @param recursive recurse into visited subfolders if true
* @param notifyAdd true if listener should be notified about newly discovered subfolders
* @param monitor recursion task monitor - break from recursion if cancelled * @param monitor recursion task monitor - break from recursion if cancelled
* @throws IOException if an IO error occurs during the refresh * @throws IOException if an IO error occurs during the refresh
*/ */
private void refreshFolders(boolean recursive, TaskMonitor monitor) throws IOException { private void refreshFolders(boolean recursive, boolean notifyAdd, TaskMonitor monitor)
throws IOException {
// FIXME: inconsistent use of forced-recursive refresh and cached folderList // FIXME: inconsistent use of forced-recursive refresh and cached folderList
@ -630,7 +632,7 @@ class GhidraFolderData {
GhidraFolderData folderData = addFolderData(folderName); GhidraFolderData folderData = addFolderData(folderName);
if (folderData != null) { if (folderData != null) {
folderList.add(folderName); folderList.add(folderName);
if (visited) { if (notifyAdd) {
listener.domainFolderAdded(folderData.getDomainFolder()); listener.domainFolderAdded(folderData.getDomainFolder());
} }
} }
@ -678,7 +680,13 @@ class GhidraFolderData {
return map; return map;
} }
private void refreshFiles(TaskMonitor monitor) throws IOException { /**
* Refresh set of files and notify about adds/removes if appropriate
* @param notifyAdd true if listener should be notified about newly discovered files
* @param monitor return immediately if cancelled
* @throws IOException if an IO error occurs during the refresh
*/
private void refreshFiles(boolean notifyAdd, TaskMonitor monitor) throws IOException {
String path = getPathname(); String path = getPathname();
@ -744,7 +752,7 @@ class GhidraFolderData {
FolderItem versionedFolderItem = versionedItemMap.get(fileName); FolderItem versionedFolderItem = versionedItemMap.get(fileName);
GhidraFileData fileData = addFileData(fileName, localFolderItem, versionedFolderItem); GhidraFileData fileData = addFileData(fileName, localFolderItem, versionedFolderItem);
if (visited) { if (notifyAdd) {
listener.domainFileAdded(fileData.getDomainFile()); listener.domainFileAdded(fileData.getDomainFile());
} }
} }
@ -791,6 +799,7 @@ class GhidraFolderData {
return; return;
} }
boolean notifyAdd = visited;
visited = true; visited = true;
try { try {
@ -812,13 +821,13 @@ class GhidraFolderData {
// FIXME: If forced we should be refreshing folder/file lists // FIXME: If forced we should be refreshing folder/file lists
refreshFiles(monitor); refreshFiles(notifyAdd, monitor);
if (monitor != null && monitor.isCancelled()) { if (monitor != null && monitor.isCancelled()) {
return; // break-out from recursion on cancel return; // break-out from recursion on cancel
} }
refreshFolders(recursive, monitor); refreshFolders(recursive, notifyAdd, monitor);
} }
} }