mirror of
https://github.com/openai/codex.git
synced 2026-11-05 20:10:33 +00:00
refactor(permissions): rename Git write setting
Co-authored-by: Codex noreply@openai.com
This commit is contained in:
co-authored by
Codex noreply@openai.com
parent
3a7ed39a1e
commit
605463e4cc
@@ -505,13 +505,13 @@ impl From<NetworkRequirementsToml> for NetworkConstraints {
|
||||
#[derive(Debug, Clone, Default, PartialEq, Eq)]
|
||||
pub struct FilesystemRequirementsToml {
|
||||
pub deny_read: Option<Vec<FilesystemDenyReadPattern>>,
|
||||
pub allow_limited_git_writes: Option<bool>,
|
||||
pub allow_git: Option<bool>,
|
||||
}
|
||||
|
||||
#[derive(Deserialize)]
|
||||
struct RawFilesystemRequirementsToml {
|
||||
deny_read: Option<Vec<FilesystemDenyReadPattern>>,
|
||||
allow_limited_git_writes: Option<bool>,
|
||||
allow_git: Option<bool>,
|
||||
description: Option<serde::de::IgnoredAny>,
|
||||
extends: Option<serde::de::IgnoredAny>,
|
||||
workspace_roots: Option<serde::de::IgnoredAny>,
|
||||
@@ -527,7 +527,7 @@ impl<'de> Deserialize<'de> for FilesystemRequirementsToml {
|
||||
let raw = RawFilesystemRequirementsToml::deserialize(deserializer)?;
|
||||
let RawFilesystemRequirementsToml {
|
||||
deny_read,
|
||||
allow_limited_git_writes,
|
||||
allow_git,
|
||||
description,
|
||||
extends,
|
||||
workspace_roots,
|
||||
@@ -548,7 +548,7 @@ impl<'de> Deserialize<'de> for FilesystemRequirementsToml {
|
||||
|
||||
Ok(Self {
|
||||
deny_read,
|
||||
allow_limited_git_writes,
|
||||
allow_git,
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -565,7 +565,7 @@ pub struct PermissionsRequirementsToml {
|
||||
#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
|
||||
pub struct FilesystemConstraints {
|
||||
pub deny_read: Vec<FilesystemDenyReadPattern>,
|
||||
pub allow_limited_git_writes: Option<bool>,
|
||||
pub allow_git: Option<bool>,
|
||||
}
|
||||
|
||||
impl From<PermissionsRequirementsToml> for FilesystemConstraints {
|
||||
@@ -575,7 +575,7 @@ impl From<PermissionsRequirementsToml> for FilesystemConstraints {
|
||||
};
|
||||
Self {
|
||||
deny_read: filesystem.deny_read.unwrap_or_default(),
|
||||
allow_limited_git_writes: filesystem.allow_limited_git_writes,
|
||||
allow_git: filesystem.allow_git,
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2003,7 +2003,7 @@ allowed_approvals_reviewers = ["user"]
|
||||
r#"
|
||||
[permissions.filesystem]
|
||||
deny_read = [{deny_read_0:?}, {deny_read_1:?}]
|
||||
allow_limited_git_writes = true
|
||||
allow_git = true
|
||||
"#
|
||||
);
|
||||
|
||||
@@ -2018,7 +2018,7 @@ allowed_approvals_reviewers = ["user"]
|
||||
AbsolutePathBuf::from_absolute_path(deny_read_0)?.into(),
|
||||
AbsolutePathBuf::from_absolute_path(deny_read_1)?.into(),
|
||||
],
|
||||
allow_limited_git_writes: Some(true),
|
||||
allow_git: Some(true),
|
||||
},
|
||||
RequirementSource::Unknown,
|
||||
))
|
||||
@@ -2047,7 +2047,7 @@ allowed_approvals_reviewers = ["user"]
|
||||
FilesystemDenyReadPattern::from_input("./private/**/*.txt")
|
||||
.expect("normalize glob pattern"),
|
||||
],
|
||||
allow_limited_git_writes: None,
|
||||
allow_git: None,
|
||||
},
|
||||
RequirementSource::Unknown,
|
||||
))
|
||||
|
||||
@@ -13,7 +13,7 @@ Expects `/usr/bin/sandbox-exec` to be present.
|
||||
When using the workspace-write sandbox policy, the Seatbelt profile allows
|
||||
writes under the configured writable roots while keeping `.git` (directory or
|
||||
pointer file), the resolved `gitdir:` target, and `.codex` read-only by
|
||||
default. When `allow_limited_git_writes` is enabled, Git metadata writes are allowed,
|
||||
default. When `allow_git` is enabled, Git metadata writes are allowed,
|
||||
but `.git/config`, `.git/hooks`, and resolved worktree gitdir config/hooks
|
||||
remain read-only.
|
||||
|
||||
|
||||
@@ -886,6 +886,10 @@
|
||||
},
|
||||
"FilesystemPermissionsToml": {
|
||||
"properties": {
|
||||
"allow_git": {
|
||||
"default": false,
|
||||
"type": "boolean"
|
||||
},
|
||||
"glob_scan_max_depth": {
|
||||
"description": "Optional maximum depth for expanding unreadable glob patterns on platforms that snapshot glob matches before sandbox startup.",
|
||||
"format": "uint",
|
||||
|
||||
@@ -1548,7 +1548,7 @@ extends = ":workspace"
|
||||
let requirements = format!(
|
||||
r#"
|
||||
[permissions.filesystem]
|
||||
allow_limited_git_writes = true
|
||||
allow_git = true
|
||||
|
||||
{managed_profile}"#
|
||||
);
|
||||
@@ -1600,11 +1600,11 @@ default_permissions = "local"
|
||||
extends = ":workspace"
|
||||
|
||||
[permissions.local.filesystem]
|
||||
allow_limited_git_writes = true
|
||||
allow_git = true
|
||||
"#,
|
||||
r#"
|
||||
[permissions.filesystem]
|
||||
allow_limited_git_writes = false
|
||||
allow_git = false
|
||||
"#,
|
||||
None,
|
||||
)
|
||||
@@ -1642,7 +1642,7 @@ extends = ":workspace"
|
||||
"#,
|
||||
r#"
|
||||
[permissions.filesystem]
|
||||
allow_limited_git_writes = true
|
||||
allow_git = true
|
||||
"#,
|
||||
None,
|
||||
)
|
||||
@@ -1678,7 +1678,7 @@ exclude_slash_tmp = true
|
||||
"#,
|
||||
r#"
|
||||
[permissions.filesystem]
|
||||
allow_limited_git_writes = true
|
||||
allow_git = true
|
||||
"#,
|
||||
None,
|
||||
)
|
||||
@@ -1716,7 +1716,7 @@ async fn system_filesystem_requirements_reject_unrestricted_profile_selection()
|
||||
r#"sandbox_mode = "danger-full-access""#,
|
||||
r#"
|
||||
[permissions.filesystem]
|
||||
allow_limited_git_writes = true
|
||||
allow_git = true
|
||||
"#,
|
||||
None,
|
||||
)
|
||||
|
||||
@@ -900,6 +900,7 @@ strip_request_headers = ["authorization"]
|
||||
}),
|
||||
filesystem: Some(FilesystemPermissionsToml {
|
||||
glob_scan_max_depth: None,
|
||||
allow_git: false,
|
||||
entries: BTreeMap::from([
|
||||
(
|
||||
":minimal".to_string(),
|
||||
@@ -1117,6 +1118,7 @@ async fn permissions_profiles_proxy_policy_does_not_start_managed_network_proxy_
|
||||
workspace_roots: None,
|
||||
filesystem: Some(FilesystemPermissionsToml {
|
||||
glob_scan_max_depth: None,
|
||||
allow_git: false,
|
||||
entries: BTreeMap::from([(
|
||||
":minimal".to_string(),
|
||||
FilesystemPermissionToml::Access(FileSystemAccessMode::Read),
|
||||
@@ -1167,6 +1169,7 @@ async fn permissions_profiles_proxy_policy_starts_managed_network_proxy() -> std
|
||||
workspace_roots: None,
|
||||
filesystem: Some(FilesystemPermissionsToml {
|
||||
glob_scan_max_depth: None,
|
||||
allow_git: false,
|
||||
entries: BTreeMap::from([(
|
||||
":minimal".to_string(),
|
||||
FilesystemPermissionToml::Access(FileSystemAccessMode::Read),
|
||||
@@ -1323,6 +1326,7 @@ async fn network_proxy_feature_matrix_preserves_sandbox_network_semantics() -> s
|
||||
workspace_roots: None,
|
||||
filesystem: Some(FilesystemPermissionsToml {
|
||||
glob_scan_max_depth: None,
|
||||
allow_git: false,
|
||||
entries: BTreeMap::from([(
|
||||
":minimal".to_string(),
|
||||
FilesystemPermissionToml::Access(FileSystemAccessMode::Read),
|
||||
@@ -1476,6 +1480,7 @@ async fn network_proxy_feature_uses_profile_network_proxy_settings() -> std::io:
|
||||
workspace_roots: None,
|
||||
filesystem: Some(FilesystemPermissionsToml {
|
||||
glob_scan_max_depth: None,
|
||||
allow_git: false,
|
||||
entries: BTreeMap::from([(
|
||||
":minimal".to_string(),
|
||||
FilesystemPermissionToml::Access(FileSystemAccessMode::Read),
|
||||
@@ -1540,6 +1545,7 @@ enabled = false
|
||||
workspace_roots: None,
|
||||
filesystem: Some(FilesystemPermissionsToml {
|
||||
glob_scan_max_depth: None,
|
||||
allow_git: false,
|
||||
entries: BTreeMap::from([(
|
||||
":minimal".to_string(),
|
||||
FilesystemPermissionToml::Access(FileSystemAccessMode::Read),
|
||||
@@ -1591,6 +1597,7 @@ async fn permissions_profiles_network_disabled_by_default_does_not_start_proxy()
|
||||
workspace_roots: None,
|
||||
filesystem: Some(FilesystemPermissionsToml {
|
||||
glob_scan_max_depth: None,
|
||||
allow_git: false,
|
||||
entries: BTreeMap::from([(
|
||||
":minimal".to_string(),
|
||||
FilesystemPermissionToml::Access(FileSystemAccessMode::Read),
|
||||
@@ -1640,6 +1647,7 @@ async fn default_permissions_profile_populates_runtime_sandbox_policy() -> std::
|
||||
workspace_roots: None,
|
||||
filesystem: Some(FilesystemPermissionsToml {
|
||||
glob_scan_max_depth: None,
|
||||
allow_git: false,
|
||||
entries: BTreeMap::from([
|
||||
(
|
||||
":minimal".to_string(),
|
||||
@@ -1700,7 +1708,7 @@ async fn default_permissions_profile_populates_runtime_sandbox_policy() -> std::
|
||||
&SandboxPolicy::WorkspaceWrite {
|
||||
writable_roots: vec![],
|
||||
network_access: false,
|
||||
allow_limited_git_writes: false,
|
||||
allow_git: false,
|
||||
exclude_tmpdir_env_var: true,
|
||||
exclude_slash_tmp: true,
|
||||
}
|
||||
@@ -1745,6 +1753,7 @@ async fn default_permissions_extended_profile_preserves_parent_metadata() -> std
|
||||
workspace_roots: None,
|
||||
filesystem: Some(FilesystemPermissionsToml {
|
||||
glob_scan_max_depth: None,
|
||||
allow_git: false,
|
||||
entries: BTreeMap::from([(
|
||||
":minimal".to_string(),
|
||||
FilesystemPermissionToml::Access(FileSystemAccessMode::Read),
|
||||
@@ -1973,7 +1982,7 @@ async fn permission_profile_override_keeps_memories_root_out_of_legacy_projectio
|
||||
&SandboxPolicy::WorkspaceWrite {
|
||||
writable_roots: vec![],
|
||||
network_access: false,
|
||||
allow_limited_git_writes: false,
|
||||
allow_git: false,
|
||||
exclude_tmpdir_env_var: true,
|
||||
exclude_slash_tmp: true,
|
||||
}
|
||||
@@ -2000,6 +2009,7 @@ async fn permission_profile_override_preserves_configured_network_policy_without
|
||||
workspace_roots: None,
|
||||
filesystem: Some(FilesystemPermissionsToml {
|
||||
glob_scan_max_depth: None,
|
||||
allow_git: false,
|
||||
entries: BTreeMap::from([(
|
||||
":minimal".to_string(),
|
||||
FilesystemPermissionToml::Access(FileSystemAccessMode::Read),
|
||||
@@ -2062,6 +2072,7 @@ async fn workspace_root_glob_none_compiles_to_filesystem_pattern_entry() -> std:
|
||||
workspace_roots: None,
|
||||
filesystem: Some(FilesystemPermissionsToml {
|
||||
glob_scan_max_depth: Some(2),
|
||||
allow_git: false,
|
||||
entries: BTreeMap::from([(
|
||||
":workspace_roots".to_string(),
|
||||
FilesystemPermissionToml::Scoped(BTreeMap::from([
|
||||
@@ -2143,6 +2154,7 @@ async fn permissions_profiles_require_default_permissions() -> std::io::Result<(
|
||||
workspace_roots: None,
|
||||
filesystem: Some(FilesystemPermissionsToml {
|
||||
glob_scan_max_depth: None,
|
||||
allow_git: false,
|
||||
entries: BTreeMap::from([(
|
||||
":minimal".to_string(),
|
||||
FilesystemPermissionToml::Access(FileSystemAccessMode::Read),
|
||||
@@ -2277,6 +2289,7 @@ async fn workspace_profile_applies_rules_to_runtime_and_profile_workspace_roots(
|
||||
}),
|
||||
filesystem: Some(FilesystemPermissionsToml {
|
||||
glob_scan_max_depth: None,
|
||||
allow_git: false,
|
||||
entries: BTreeMap::from([(
|
||||
":workspace_roots".to_string(),
|
||||
FilesystemPermissionToml::Scoped(BTreeMap::from([
|
||||
@@ -2360,7 +2373,7 @@ async fn explicit_builtin_workspace_profile_ignores_legacy_workspace_write_setti
|
||||
sandbox_workspace_write: Some(SandboxWorkspaceWrite {
|
||||
writable_roots: vec![extra_root.path().abs()],
|
||||
network_access: true,
|
||||
allow_limited_git_writes: false,
|
||||
allow_git: false,
|
||||
exclude_tmpdir_env_var: true,
|
||||
exclude_slash_tmp: true,
|
||||
}),
|
||||
@@ -2577,7 +2590,7 @@ async fn implicit_builtin_workspace_profile_preserves_sandbox_workspace_write_se
|
||||
sandbox_workspace_write: Some(SandboxWorkspaceWrite {
|
||||
writable_roots: vec![extra_root.clone()],
|
||||
network_access: true,
|
||||
allow_limited_git_writes: false,
|
||||
allow_git: false,
|
||||
exclude_tmpdir_env_var: true,
|
||||
exclude_slash_tmp: false,
|
||||
}),
|
||||
@@ -2847,6 +2860,7 @@ async fn permissions_profiles_allow_direct_write_roots_outside_workspace_root()
|
||||
workspace_roots: None,
|
||||
filesystem: Some(FilesystemPermissionsToml {
|
||||
glob_scan_max_depth: None,
|
||||
allow_git: false,
|
||||
entries: BTreeMap::from([(
|
||||
external_write_path.to_string_lossy().into_owned(),
|
||||
FilesystemPermissionToml::Access(FileSystemAccessMode::Write),
|
||||
@@ -2884,7 +2898,7 @@ async fn permissions_profiles_allow_direct_write_roots_outside_workspace_root()
|
||||
&SandboxPolicy::WorkspaceWrite {
|
||||
writable_roots: vec![external_write_path],
|
||||
network_access: false,
|
||||
allow_limited_git_writes: false,
|
||||
allow_git: false,
|
||||
exclude_tmpdir_env_var: true,
|
||||
exclude_slash_tmp: true,
|
||||
}
|
||||
@@ -2911,6 +2925,7 @@ async fn permissions_profiles_reject_nested_entries_for_non_workspace_roots() ->
|
||||
workspace_roots: None,
|
||||
filesystem: Some(FilesystemPermissionsToml {
|
||||
glob_scan_max_depth: None,
|
||||
allow_git: false,
|
||||
entries: BTreeMap::from([(
|
||||
":minimal".to_string(),
|
||||
FilesystemPermissionToml::Scoped(BTreeMap::from([(
|
||||
@@ -2974,6 +2989,7 @@ async fn permissions_profiles_allow_unknown_special_paths() -> std::io::Result<(
|
||||
workspace_roots: None,
|
||||
filesystem: Some(FilesystemPermissionsToml {
|
||||
glob_scan_max_depth: None,
|
||||
allow_git: false,
|
||||
entries: BTreeMap::from([(
|
||||
":future_special_path".to_string(),
|
||||
FilesystemPermissionToml::Access(FileSystemAccessMode::Read),
|
||||
@@ -3020,6 +3036,7 @@ async fn permissions_profiles_allow_unknown_special_paths_with_nested_entries()
|
||||
workspace_roots: None,
|
||||
filesystem: Some(FilesystemPermissionsToml {
|
||||
glob_scan_max_depth: None,
|
||||
allow_git: false,
|
||||
entries: BTreeMap::from([(
|
||||
":future_special_path".to_string(),
|
||||
FilesystemPermissionToml::Scoped(BTreeMap::from([(
|
||||
@@ -3090,6 +3107,7 @@ async fn permissions_profiles_allow_empty_filesystem_with_warning() -> std::io::
|
||||
workspace_roots: None,
|
||||
filesystem: Some(FilesystemPermissionsToml {
|
||||
glob_scan_max_depth: None,
|
||||
allow_git: false,
|
||||
entries: BTreeMap::new(),
|
||||
}),
|
||||
network: None,
|
||||
@@ -3128,6 +3146,7 @@ async fn permissions_profiles_reject_workspace_root_parent_traversal() -> std::i
|
||||
workspace_roots: None,
|
||||
filesystem: Some(FilesystemPermissionsToml {
|
||||
glob_scan_max_depth: None,
|
||||
allow_git: false,
|
||||
entries: BTreeMap::from([(
|
||||
":workspace_roots".to_string(),
|
||||
FilesystemPermissionToml::Scoped(BTreeMap::from([(
|
||||
@@ -3177,6 +3196,7 @@ async fn permissions_profiles_allow_network_enablement() -> std::io::Result<()>
|
||||
workspace_roots: None,
|
||||
filesystem: Some(FilesystemPermissionsToml {
|
||||
glob_scan_max_depth: None,
|
||||
allow_git: false,
|
||||
entries: BTreeMap::from([(
|
||||
":minimal".to_string(),
|
||||
FilesystemPermissionToml::Access(FileSystemAccessMode::Read),
|
||||
@@ -3606,7 +3626,7 @@ trust_level = "trusted"
|
||||
SandboxPolicy::WorkspaceWrite {
|
||||
writable_roots: vec![writable_root.clone()],
|
||||
network_access: false,
|
||||
allow_limited_git_writes: false,
|
||||
allow_git: false,
|
||||
exclude_tmpdir_env_var: true,
|
||||
exclude_slash_tmp: true,
|
||||
}
|
||||
@@ -3647,7 +3667,7 @@ exclude_slash_tmp = true
|
||||
SandboxPolicy::WorkspaceWrite {
|
||||
writable_roots: vec![writable_root],
|
||||
network_access: false,
|
||||
allow_limited_git_writes: false,
|
||||
allow_git: false,
|
||||
exclude_tmpdir_env_var: true,
|
||||
exclude_slash_tmp: true,
|
||||
}
|
||||
|
||||
@@ -2150,7 +2150,7 @@ fn apply_managed_filesystem_constraints(
|
||||
filesystem_constraints: &codex_config::FilesystemConstraints,
|
||||
cwd: &Path,
|
||||
) {
|
||||
if filesystem_constraints.allow_limited_git_writes == Some(true) {
|
||||
if filesystem_constraints.allow_git == Some(true) {
|
||||
file_system_sandbox_policy.apply_managed_limited_git_writes(cwd);
|
||||
}
|
||||
for deny_read in &filesystem_constraints.deny_read {
|
||||
@@ -3279,7 +3279,7 @@ impl Config {
|
||||
source: filesystem_requirements_source,
|
||||
}) = filesystem_requirements.as_ref()
|
||||
&& (!filesystem_requirements.deny_read.is_empty()
|
||||
|| filesystem_requirements.allow_limited_git_writes.is_some())
|
||||
|| filesystem_requirements.allow_git.is_some())
|
||||
{
|
||||
let requirement_source = filesystem_requirements_source.clone();
|
||||
constrained_permission_profile
|
||||
@@ -3699,7 +3699,7 @@ impl Config {
|
||||
.requirements()
|
||||
.filesystem
|
||||
.as_ref()
|
||||
.and_then(|filesystem| filesystem.value.allow_limited_git_writes)
|
||||
.and_then(|filesystem| filesystem.value.allow_git)
|
||||
}
|
||||
|
||||
pub(crate) fn network_proxy_spec_for_active_permission_profile(
|
||||
|
||||
@@ -72,6 +72,7 @@ async fn restricted_read_implicitly_allows_helper_executables() -> std::io::Resu
|
||||
workspace_roots: None,
|
||||
filesystem: Some(FilesystemPermissionsToml {
|
||||
glob_scan_max_depth: None,
|
||||
allow_git: false,
|
||||
entries: BTreeMap::new(),
|
||||
}),
|
||||
network: None,
|
||||
@@ -471,6 +472,7 @@ fn compile_permission_profile_workspace_roots_resolves_enabled_entries() -> std:
|
||||
fn read_write_glob_warnings_skip_supported_deny_read_globs_and_trailing_subpaths() {
|
||||
let filesystem = FilesystemPermissionsToml {
|
||||
glob_scan_max_depth: None,
|
||||
allow_git: false,
|
||||
entries: BTreeMap::from([
|
||||
(
|
||||
"/tmp/**/*.log".to_string(),
|
||||
@@ -505,6 +507,7 @@ fn read_write_glob_warnings_skip_supported_deny_read_globs_and_trailing_subpaths
|
||||
fn unreadable_globstar_warning_is_suppressed_when_scan_depth_is_configured() {
|
||||
let filesystem = FilesystemPermissionsToml {
|
||||
glob_scan_max_depth: None,
|
||||
allow_git: false,
|
||||
entries: BTreeMap::from([(
|
||||
":workspace_roots".to_string(),
|
||||
FilesystemPermissionToml::Scoped(BTreeMap::from([
|
||||
@@ -557,7 +560,7 @@ fn workspace_parent_uses_profile_limited_git_write_setting() -> std::io::Result<
|
||||
workspace_roots: None,
|
||||
filesystem: Some(FilesystemPermissionsToml {
|
||||
glob_scan_max_depth: None,
|
||||
allow_limited_git_writes: true,
|
||||
allow_git: true,
|
||||
entries: BTreeMap::new(),
|
||||
}),
|
||||
network: None,
|
||||
@@ -598,6 +601,7 @@ fn read_write_trailing_glob_suffix_compiles_as_subpath() -> std::io::Result<()>
|
||||
workspace_roots: None,
|
||||
filesystem: Some(FilesystemPermissionsToml {
|
||||
glob_scan_max_depth: None,
|
||||
allow_git: false,
|
||||
entries: BTreeMap::from([(
|
||||
":workspace_roots".to_string(),
|
||||
FilesystemPermissionToml::Scoped(BTreeMap::from([(
|
||||
|
||||
@@ -242,9 +242,9 @@ fn render_debug_config_lines(stack: &ConfigLayerStack) -> Vec<Line<'static>> {
|
||||
}
|
||||
|
||||
if let Some(filesystem) = requirements.filesystem.as_ref() {
|
||||
if let Some(allow_limited_git_writes) = filesystem.value.allow_limited_git_writes {
|
||||
if let Some(allow_limited_git_writes) = filesystem.value.allow_git {
|
||||
requirement_lines.push(requirement_line(
|
||||
"permissions.filesystem.allow_limited_git_writes",
|
||||
"permissions.filesystem.allow_git",
|
||||
allow_limited_git_writes.to_string(),
|
||||
Some(&filesystem.source),
|
||||
));
|
||||
@@ -696,7 +696,7 @@ mod tests {
|
||||
filesystem: Some(Sourced::new(
|
||||
FilesystemConstraints {
|
||||
deny_read: vec![denied_path.clone().into()],
|
||||
allow_limited_git_writes: Some(true),
|
||||
allow_git: Some(true),
|
||||
},
|
||||
RequirementSource::SystemRequirementsToml {
|
||||
file: requirements_file.clone(),
|
||||
@@ -791,7 +791,7 @@ mod tests {
|
||||
assert!(
|
||||
rendered.contains(
|
||||
format!(
|
||||
"permissions.filesystem.allow_limited_git_writes: true (source: {})",
|
||||
"permissions.filesystem.allow_git: true (source: {})",
|
||||
requirements_file.as_path().display()
|
||||
)
|
||||
.as_str(),
|
||||
|
||||
Reference in New Issue
Block a user