Skip to content

[hermes] Add shadow copy creation#3006

Open
joshlf wants to merge 1 commit intoGb7f1abf97eed8a035dbcaf7b0363b5890baaec05from
Gdc72294eb3c40c4afa61ea6e8f965ba310cd22ef
Open

[hermes] Add shadow copy creation#3006
joshlf wants to merge 1 commit intoGb7f1abf97eed8a035dbcaf7b0363b5890baaec05from
Gdc72294eb3c40c4afa61ea6e8f965ba310cd22ef

Conversation

@joshlf
Copy link
Member

@joshlf joshlf commented Feb 7, 2026


Latest Update: v22 — Compare vs v21

📚 Full Patch History

Links show the diff between the row version and the column version.

Version v21 v20 v19 v18 v17 v16 v15 v14 v13 v12 v11 v10 v9 v8 v7 v6 v5 v4 v3 v2 v1 Base
v22 v21 v20 v19 v18 v17 v16 v15 v14 v13 v12 v11 v10 v9 v8 v7 v6 v5 v4 v3 v2 v1 Base
v21 v20 v19 v18 v17 v16 v15 v14 v13 v12 v11 v10 v9 v8 v7 v6 v5 v4 v3 v2 v1 Base
v20 v19 v18 v17 v16 v15 v14 v13 v12 v11 v10 v9 v8 v7 v6 v5 v4 v3 v2 v1 Base
v19 v18 v17 v16 v15 v14 v13 v12 v11 v10 v9 v8 v7 v6 v5 v4 v3 v2 v1 Base
v18 v17 v16 v15 v14 v13 v12 v11 v10 v9 v8 v7 v6 v5 v4 v3 v2 v1 Base
v17 v16 v15 v14 v13 v12 v11 v10 v9 v8 v7 v6 v5 v4 v3 v2 v1 Base
v16 v15 v14 v13 v12 v11 v10 v9 v8 v7 v6 v5 v4 v3 v2 v1 Base
v15 v14 v13 v12 v11 v10 v9 v8 v7 v6 v5 v4 v3 v2 v1 Base
v14 v13 v12 v11 v10 v9 v8 v7 v6 v5 v4 v3 v2 v1 Base
v13 v12 v11 v10 v9 v8 v7 v6 v5 v4 v3 v2 v1 Base
v12 v11 v10 v9 v8 v7 v6 v5 v4 v3 v2 v1 Base
v11 v10 v9 v8 v7 v6 v5 v4 v3 v2 v1 Base
v10 v9 v8 v7 v6 v5 v4 v3 v2 v1 Base
v9 v8 v7 v6 v5 v4 v3 v2 v1 Base
v8 v7 v6 v5 v4 v3 v2 v1 Base
v7 v6 v5 v4 v3 v2 v1 Base
v6 v5 v4 v3 v2 v1 Base
v5 v4 v3 v2 v1 Base
v4 v3 v2 v1 Base
v3 v2 v1 Base
v2 v1 Base
v1 Base
⬇️ Download this PR

Branch

git fetch origin refs/heads/Gdc72294eb3c40c4afa61ea6e8f965ba310cd22ef && git checkout -b pr-Gdc72294eb3c40c4afa61ea6e8f965ba310cd22ef FETCH_HEAD

Checkout

git fetch origin refs/heads/Gdc72294eb3c40c4afa61ea6e8f965ba310cd22ef && git checkout FETCH_HEAD

Cherry Pick

git fetch origin refs/heads/Gdc72294eb3c40c4afa61ea6e8f965ba310cd22ef && git cherry-pick FETCH_HEAD

Pull

git pull origin refs/heads/Gdc72294eb3c40c4afa61ea6e8f965ba310cd22ef

Stacked PRs enabled by GHerrit.

gherrit-pr-id: Gdc72294eb3c40c4afa61ea6e8f965ba310cd22ef
@gemini-code-assist
Copy link
Contributor

Warning

You have reached your daily quota limit. Please wait up to 24 hours and I will start processing your requests again!

@codecov-commenter
Copy link

Codecov Report

✅ All modified and coverable lines are covered by tests.
⚠️ Please upload report for BASE (Gb7f1abf97eed8a035dbcaf7b0363b5890baaec05@7c251d8). Learn more about missing BASE report.

Additional details and impacted files
@@                             Coverage Diff                              @@
##             Gb7f1abf97eed8a035dbcaf7b0363b5890baaec05    #3006   +/-   ##
============================================================================
  Coverage                                             ?   91.87%           
============================================================================
  Files                                                ?       20           
  Lines                                                ?     6057           
  Branches                                             ?        0           
============================================================================
  Hits                                                 ?     5565           
  Misses                                               ?      492           
  Partials                                             ?        0           

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@joshlf
Copy link
Member Author

joshlf commented Feb 7, 2026

/gemini review

Copy link
Contributor

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request introduces the capability to create a shadow copy of a project for the hermes verification tool. It adds the walkdir dependency to traverse the file system and includes a new shadow module with logic for creating a skeleton of the source project using symlinks. The changes also include a refactoring of how compilation roots are resolved and a new check to ensure all local dependencies are contained within the workspace. The code is well-structured and the error handling is robust. My feedback is focused on minor improvements to error message formatting for better user experience.

Comment on lines +288 to +294
anyhow::bail!(
"Unsupported external dependency: '{}' at {:?}.\n\
Hermes currently only supports verifying workspaces where all local \
dependencies are contained within the workspace root.",
pkg.name,
pkg_path
);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

For more user-friendly error messages, it's better to use .display() for printing paths instead of the Debug format ({:?}). The Debug format for Path includes quotes, which can make the output less clean for users.

Suggested change
anyhow::bail!(
"Unsupported external dependency: '{}' at {:?}.\n\
Hermes currently only supports verifying workspaces where all local \
dependencies are contained within the workspace root.",
pkg.name,
pkg_path
);
anyhow::bail!(
"Unsupported external dependency: '{}' at {}.\n\
Hermes currently only supports verifying workspaces where all local \
dependencies are contained within the workspace root.",
pkg.name,
pkg_path.display()
);


if entry.file_type().is_dir() {
fs::create_dir_all(&dest_path)
.with_context(|| format!("Failed to create shadow directory: {:?}", dest_path))?;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

To improve the readability of error messages, consider using .display() for formatting paths instead of the Debug format ({:?}). The Debug format adds quotes around the path, which is often not ideal for user-facing output.

Suggested change
.with_context(|| format!("Failed to create shadow directory: {:?}", dest_path))?;
.with_context(|| format!("Failed to create shadow directory: {}", dest_path.display()))?;

#[cfg(unix)]
fn make_symlink(original: &Path, link: &Path) -> Result<()> {
std::os::unix::fs::symlink(original, link)
.with_context(|| format!("Failed to symlink {:?} -> {:?}", original, link))
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

For cleaner and more user-friendly error messages, it's preferable to use .display() to format paths instead of the Debug format ({:?}).

Suggested change
.with_context(|| format!("Failed to symlink {:?} -> {:?}", original, link))
.with_context(|| format!("Failed to symlink {} -> {}", original.display(), link.display()))

// Since we only call this on files (checking is_file above),
// we use symlink_file.
std::os::windows::fs::symlink_file(original, link)
.with_context(|| format!("Failed to symlink {:?} -> {:?}", original, link))
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

To improve the readability of error messages, consider using .display() for formatting paths instead of the Debug format ({:?}). This will provide a cleaner output for the user.

Suggested change
.with_context(|| format!("Failed to symlink {:?} -> {:?}", original, link))
.with_context(|| format!("Failed to symlink {} -> {}", original.display(), link.display()))

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants