Skip to content

fix(api-proxy): derive api.subdomain.ghe.com for GHEC domains#1072

Open
Claude wants to merge 4 commits intomainfrom
claude/fix-api-proxy-config
Open

fix(api-proxy): derive api.subdomain.ghe.com for GHEC domains#1072
Claude wants to merge 4 commits intomainfrom
claude/fix-api-proxy-config

Conversation

@Claude
Copy link
Contributor

@Claude Claude AI commented Feb 26, 2026

Summary

This PR adds automatic Copilot API endpoint derivation for GitHub Enterprise Cloud (GHEC) with data residency domains (*.ghe.com).

Changes

  • API Proxy Enhancement: The api-proxy now automatically derives the correct Copilot API endpoint based on GITHUB_SERVER_URL

    • For *.ghe.com domains: mycompany.ghe.comapi.mycompany.ghe.com
    • For other enterprise hosts (GHES): continues to use api.enterprise.githubcopilot.com
    • For github.com: continues to use api.githubcopilot.com
  • Test Coverage: Refactored tests to use real implementation instead of duplicate

    • Exported deriveCopilotApiTarget function from server.js
    • Removed standalone duplicate implementation (72 lines of duplicate code eliminated)
    • All 12 tests pass with real function
  • Documentation: Updated docs/api-proxy-sidecar.md with:

    • Usage examples showing wildcard domain patterns (*.mycompany.ghe.com)
    • Explanation of automatic endpoint derivation
    • Domain matching clarification (wildcards match subdomains)
    • Environment variable reference table updated to show both flag and env var sources

Why This Matters

GHEC customers with data residency requirements use custom domains like mycompany.ghe.com and need traffic routed to region-specific API endpoints (api.mycompany.ghe.com) rather than the generic enterprise endpoint. This change makes that routing automatic when GITHUB_SERVER_URL is set, eliminating the need for manual --copilot-api-target configuration.

Testing

  • ✅ Unit tests refactored to use real implementation (no more duplicate code)
  • ✅ Covers GHEC, GHES, and github.com scenarios
  • ✅ Validates explicit override via COPILOT_API_TARGET env var
  • ✅ Server.js can still be run directly (require.main check)

Claude AI and others added 2 commits February 26, 2026 23:08
Co-authored-by: lpcox <15877973+lpcox@users.noreply.github.com>
@Claude Claude AI assigned Claude and lpcox Feb 26, 2026
@Mossaka Mossaka marked this pull request as ready for review February 27, 2026 00:53
Copilot AI review requested due to automatic review settings February 27, 2026 00:53
@lpcox lpcox changed the title Completing task feat: pass enterprise environment variables to proxy Feb 27, 2026
@github-actions
Copy link
Contributor

github-actions bot commented Feb 27, 2026

✅ Coverage Check Passed

Overall Coverage

Metric Base PR Delta
Lines 82.03% 82.18% 📈 +0.15%
Statements 82.01% 82.15% 📈 +0.14%
Functions 82.50% 82.50% ➡️ +0.00%
Branches 74.20% 74.29% 📈 +0.09%
📁 Per-file Coverage Changes (1 files)
File Lines (Before → After) Statements (Before → After)
src/docker-manager.ts 83.1% → 83.7% (+0.56%) 82.4% → 83.0% (+0.54%)

Coverage comparison generated by scripts/ci/compare-coverage.ts

@lpcox
Copy link
Collaborator

lpcox commented Feb 27, 2026

@claude[agent] can you add a description for this pr?

@Claude
Copy link
Contributor Author

Claude AI commented Feb 27, 2026

@claude[agent] can you add a description for this pr?

Added a comprehensive PR description explaining the automatic Copilot API endpoint derivation for GHEC domains. (commit 085cf29)

Warning

Firewall rules blocked me from connecting to one or more addresses (expand for details)

I tried to connect to the following addresses, but was blocked by firewall rules:

  • https://api.github.com/graphql
    • Triggering command: /usr/bin/gh gh pr view --json body,title,number (http block)

If you need me to access, download, or install something from one of these locations, you can either:

@Claude Claude AI changed the title feat: pass enterprise environment variables to proxy fix(api-proxy): derive api.subdomain.ghe.com for GHEC domains Feb 27, 2026
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

This PR adds GitHub Enterprise Cloud data residency (*.ghe.com) support for Copilot API routing in the API proxy sidecar, along with documentation and tests.

Changes:

  • Update deriveCopilotApiTarget() to auto-derive api.<subdomain>.ghe.com when GITHUB_SERVER_URL ends with .ghe.com.
  • Document *.ghe.com configuration and the related environment variables/flags.
  • Add Jest tests intended to cover the Copilot API target derivation logic.

Reviewed changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated 3 comments.

File Description
docs/api-proxy-sidecar.md Documents *.ghe.com auto-derivation behavior and adds COPILOT_API_TARGET / GITHUB_SERVER_URL to the env var table.
containers/api-proxy/server.test.js Adds tests for Copilot API target derivation (currently via a standalone duplicate implementation).
containers/api-proxy/server.js Implements .ghe.comapi.<subdomain>.ghe.com derivation logic in deriveCopilotApiTarget().
Comments suppressed due to low confidence (1)

containers/api-proxy/server.test.js:33

  • The jest.mock() calls and require cache deletion in getDerivedTarget() are currently dead code: nothing requires ./server.js afterward, and the return value doesn’t depend on process.env. Once the test is updated to import the real deriveCopilotApiTarget(), simplify this helper to only set/restore env (or call the function with explicit inputs) to keep the test deterministic and easier to maintain.
  function getDerivedTarget(env = {}) {
    // Set environment variables
    Object.keys(env).forEach(key => {
      process.env[key] = env[key];
    });

    // Clear module cache to force re-evaluation
    delete require.cache[require.resolve('./server.js')];

    // Mock the required modules that have side effects
    jest.mock('http', () => ({
      createServer: jest.fn(() => ({
        listen: jest.fn(),
      })),
    }));

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

| `OPENAI_API_KEY` | Real API key | `--enable-api-proxy` and env set | OpenAI API key (injected into requests) |
| `ANTHROPIC_API_KEY` | Real API key | `--enable-api-proxy` and env set | Anthropic API key (injected into requests) |
| `COPILOT_GITHUB_TOKEN` | Real token | `--enable-api-proxy` and env set | GitHub Copilot token (injected into requests) |
| `COPILOT_API_TARGET` | Target hostname | `--copilot-api-target` flag | Override Copilot API endpoint (default: auto-derived) |
Copy link

Copilot AI Feb 27, 2026

Choose a reason for hiding this comment

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

In the environment variable table, COPILOT_API_TARGET can be set either via --copilot-api-target or via the host environment variable COPILOT_API_TARGET (see CLI behavior). The “When set” column currently implies it’s only set via the flag; please update this row to reflect both sources for accuracy/consistency with the other rows.

Suggested change
| `COPILOT_API_TARGET` | Target hostname | `--copilot-api-target` flag | Override Copilot API endpoint (default: auto-derived) |
| `COPILOT_API_TARGET` | Target hostname | `--copilot-api-target` flag or host env `COPILOT_API_TARGET` | Override Copilot API endpoint (default: auto-derived) |

Copilot uses AI. Check for mistakes.
Copy link
Contributor Author

Choose a reason for hiding this comment

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

Updated the environment variable table to show both sources. (commit 43f446f)

Comment on lines +18 to +96
// Helper function to reload the module and get the derived target
function getDerivedTarget(env = {}) {
// Set environment variables
Object.keys(env).forEach(key => {
process.env[key] = env[key];
});

// Clear module cache to force re-evaluation
delete require.cache[require.resolve('./server.js')];

// Mock the required modules that have side effects
jest.mock('http', () => ({
createServer: jest.fn(() => ({
listen: jest.fn(),
})),
}));

jest.mock('https', () => ({
request: jest.fn(),
}));

jest.mock('./logging', () => ({
generateRequestId: jest.fn(() => 'test-id'),
sanitizeForLog: jest.fn(x => x),
logRequest: jest.fn(),
}));

jest.mock('./metrics', () => ({
increment: jest.fn(),
gaugeInc: jest.fn(),
gaugeDec: jest.fn(),
observe: jest.fn(),
statusClass: jest.fn(() => '2xx'),
getSummary: jest.fn(() => ({})),
getMetrics: jest.fn(() => ({})),
}));

jest.mock('./rate-limiter', () => ({
create: jest.fn(() => ({
check: jest.fn(() => ({ allowed: true })),
getAllStatus: jest.fn(() => ({})),
})),
}));

// We can't easily extract the function since it's not exported,
// but we can test via the startup logs which log COPILOT_API_TARGET
// For now, let's create a standalone version to test
return deriveCopilotApiTargetStandalone(env);
}

// Standalone version of the function for testing
function deriveCopilotApiTargetStandalone(env) {
const COPILOT_API_TARGET = env.COPILOT_API_TARGET;
const GITHUB_SERVER_URL = env.GITHUB_SERVER_URL;

if (COPILOT_API_TARGET) {
return COPILOT_API_TARGET;
}

if (GITHUB_SERVER_URL) {
try {
const hostname = new URL(GITHUB_SERVER_URL).hostname;
if (hostname !== 'github.com') {
// For GitHub Enterprise Cloud with data residency (*.ghe.com),
// derive the API endpoint as api.SUBDOMAIN.ghe.com
if (hostname.endsWith('.ghe.com')) {
const subdomain = hostname.replace('.ghe.com', '');
return `api.${subdomain}.ghe.com`;
}
// For other enterprise hosts (GHES), use the generic enterprise endpoint
return 'api.enterprise.githubcopilot.com';
}
} catch {
// Invalid URL — fall through to default
}
}
return 'api.githubcopilot.com';
}

Copy link

Copilot AI Feb 27, 2026

Choose a reason for hiding this comment

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

These tests don’t exercise the production deriveCopilotApiTarget() in server.js. getDerivedTarget() clears require cache and sets up mocks, but never requires ./server.js, and ultimately returns deriveCopilotApiTargetStandalone() (a duplicated implementation). This can easily drift from server.js and give false confidence. Refactor so the real function is imported and tested (e.g., move deriveCopilotApiTarget into a small module with no side effects, or guard server startup with require.main === module and export the function), then delete the standalone copy and the unused mocks/cache handling.

This issue also appears on line 19 of the same file.

Suggested change
// Helper function to reload the module and get the derived target
function getDerivedTarget(env = {}) {
// Set environment variables
Object.keys(env).forEach(key => {
process.env[key] = env[key];
});
// Clear module cache to force re-evaluation
delete require.cache[require.resolve('./server.js')];
// Mock the required modules that have side effects
jest.mock('http', () => ({
createServer: jest.fn(() => ({
listen: jest.fn(),
})),
}));
jest.mock('https', () => ({
request: jest.fn(),
}));
jest.mock('./logging', () => ({
generateRequestId: jest.fn(() => 'test-id'),
sanitizeForLog: jest.fn(x => x),
logRequest: jest.fn(),
}));
jest.mock('./metrics', () => ({
increment: jest.fn(),
gaugeInc: jest.fn(),
gaugeDec: jest.fn(),
observe: jest.fn(),
statusClass: jest.fn(() => '2xx'),
getSummary: jest.fn(() => ({})),
getMetrics: jest.fn(() => ({})),
}));
jest.mock('./rate-limiter', () => ({
create: jest.fn(() => ({
check: jest.fn(() => ({ allowed: true })),
getAllStatus: jest.fn(() => ({})),
})),
}));
// We can't easily extract the function since it's not exported,
// but we can test via the startup logs which log COPILOT_API_TARGET
// For now, let's create a standalone version to test
return deriveCopilotApiTargetStandalone(env);
}
// Standalone version of the function for testing
function deriveCopilotApiTargetStandalone(env) {
const COPILOT_API_TARGET = env.COPILOT_API_TARGET;
const GITHUB_SERVER_URL = env.GITHUB_SERVER_URL;
if (COPILOT_API_TARGET) {
return COPILOT_API_TARGET;
}
if (GITHUB_SERVER_URL) {
try {
const hostname = new URL(GITHUB_SERVER_URL).hostname;
if (hostname !== 'github.com') {
// For GitHub Enterprise Cloud with data residency (*.ghe.com),
// derive the API endpoint as api.SUBDOMAIN.ghe.com
if (hostname.endsWith('.ghe.com')) {
const subdomain = hostname.replace('.ghe.com', '');
return `api.${subdomain}.ghe.com`;
}
// For other enterprise hosts (GHES), use the generic enterprise endpoint
return 'api.enterprise.githubcopilot.com';
}
} catch {
// Invalid URL — fall through to default
}
}
return 'api.githubcopilot.com';
}
// Helper function to get the derived target from the production implementation
function getDerivedTarget(env = {}) {
// Set environment variables
Object.keys(env).forEach(key => {
process.env[key] = env[key];
});
// Import and use the real deriveCopilotApiTarget from server.js
const { deriveCopilotApiTarget } = require('./server.js');
return deriveCopilotApiTarget();
}

Copilot uses AI. Check for mistakes.
Copy link
Contributor Author

Choose a reason for hiding this comment

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

Refactored tests to export and use the real deriveCopilotApiTarget function. Removed the duplicate standalone implementation and unused mocks. (commit 43f446f)

Comment on lines +112 to +114
sudo -E awf --enable-api-proxy \
--allow-domains api.mycompany.ghe.com,mycompany.ghe.com \
-- npx @github/copilot --prompt "your prompt"
Copy link

Copilot AI Feb 27, 2026

Choose a reason for hiding this comment

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

The docs example allowlist includes mycompany.ghe.com, but the api-proxy only makes outbound Copilot requests to the derived API host (e.g., api.mycompany.ghe.com). Listing extra domains encourages a broader-than-necessary egress policy. Consider narrowing the example to only the required Copilot API domain (and mention adding additional domains only if the user’s workflow needs them).

Copilot uses AI. Check for mistakes.
Copy link
Contributor Author

Choose a reason for hiding this comment

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

Updated examples to use wildcard pattern *.mycompany.ghe.com which matches all subdomains including api.mycompany.ghe.com. Added explanation that additional domains should only be added if needed for the user's workflow. (commit 43f446f)

@github-actions
Copy link
Contributor

🦀 Rust Build Test Results

Project Build Tests Status
fd 1/1 PASS
zoxide 1/1 PASS

Overall: ✅ PASS

Generated by Build Test Rust for issue #1072

@github-actions
Copy link
Contributor

🦕 Deno Build Test Results

Project Tests Status
oak 1/1 ✅ PASS
std 1/1 ✅ PASS

Overall: ✅ PASS

Generated by Build Test Deno for issue #1072

@github-actions
Copy link
Contributor

C++ Build Test Results

Project CMake Build Status
fmt PASS
json PASS

Overall: PASS

Generated by Build Test C++ for issue #1072

@github-actions
Copy link
Contributor

Smoke test results (run #22465649023)

✅ GitHub MCP — Last 2 merged PRs: #1069 "fix(deps): resolve high-severity rollup vulnerability in docs-site", #1067 "fix(ci): recompile ci-doctor and add missing workflows" (both by @Copilot)
✅ Playwright — github.com title contains "GitHub"
✅ File write — /tmp/gh-aw/agent/smoke-test-copilot-22465649023.txt created and verified
✅ Bash — cat confirmed file contents

Overall: PASS

📰 BREAKING: Report filed by Smoke Copilot for issue #1072

@github-actions
Copy link
Contributor

Build Test: Node.js Results

Project Install Tests Status
clsx PASS
execa PASS
p-limit PASS

Overall: ✅ PASS

Generated by Build Test Node.js for issue #1072

@github-actions
Copy link
Contributor

Smoke Test Results

Test Result
GitHub MCP (last 2 merged PRs) #1037 chore(deps): bump all-github-actions group / #1069 fix(deps): resolve rollup vulnerability
Playwright (github.com title) ✅ "GitHub · Change is constant..."
File write /tmp/gh-aw/agent/smoke-test-claude-22465649061.txt created
Bash verify ✅ File content confirmed

Overall: PASS

💥 [THE END] — Illustrated by Smoke Claude for issue #1072

@github-actions
Copy link
Contributor

Build Test: Bun Results

Project Install Tests Status
elysia 1/1 PASS
hono 1/1 PASS

Overall: ✅ PASS

Bun version: 1.3.10

Generated by Build Test Bun for issue #1072

@github-actions
Copy link
Contributor

Go Build Test Results ✅

Project Download Tests Status
color PASS PASS
env PASS PASS
uuid PASS PASS

Overall: PASS

Generated by Build Test Go for issue #1072

@Claude Claude AI changed the title fix(api-proxy): derive api.subdomain.ghe.com for GHEC domains Addressing PR comments Feb 27, 2026
@github-actions
Copy link
Contributor

Deno Build Test Results

Project Tests Status
oak 1/1 ✅ PASS
std 1/1 ✅ PASS

Overall: ✅ PASS

Deno version: 2.7.1

Generated by Build Test Deno for issue #1072

@github-actions
Copy link
Contributor

🧪 Bun Build Test Results

Project Install Tests Status
elysia 1/1 PASS
hono 1/1 PASS

Overall: PASS

All tests passed using Bun v1.3.10.

Generated by Build Test Bun for issue #1072

@github-actions
Copy link
Contributor

Go Build Test Results ✅

Project Download Tests Status
color PASS ✅ PASS
env PASS ✅ PASS
uuid PASS ✅ PASS

Overall: PASS

Generated by Build Test Go for issue #1072

@github-actions
Copy link
Contributor

🦀 Rust Build Test Results

Project Build Tests Status
fd 1/1 PASS
zoxide 1/1 PASS

Overall: ✅ PASS

Generated by Build Test Rust for issue #1072

@github-actions
Copy link
Contributor

Smoke Test Results

Recent merged PRs:

Test Result
GitHub MCP (last 2 merged PRs)
Playwright (github.com title contains "GitHub")
File write
Bash verification

Overall: PASS

💥 [THE END] — Illustrated by Smoke Claude for issue #1072

@github-actions
Copy link
Contributor

Smoke Test Results (run #22468322836)

✅ GitHub MCP — Last 2 merged PRs: #1070 chore: investigate issue duplication detector workflow failure, #1069 fix(deps): resolve high-severity rollup vulnerability in docs-site
✅ Playwright — https://github.com title contains "GitHub"
✅ File write — /tmp/gh-aw/agent/smoke-test-copilot-22468322836.txt created
✅ Bash — file verified via cat

Overall: PASS

📰 BREAKING: Report filed by Smoke Copilot for issue #1072

@github-actions
Copy link
Contributor

🟢 Build Test: Node.js — PASS

Project Install Tests Status
clsx All passed PASS
execa All passed PASS
p-limit All passed PASS

Overall: PASS

Generated by Build Test Node.js for issue #1072

@github-actions
Copy link
Contributor

C++ Build Test Results

Project CMake Build Status
fmt PASS
json PASS

Overall: PASS

Generated by Build Test C++ for issue #1072

@github-actions
Copy link
Contributor

.NET Build Test Results

Project Restore Build Run Status
hello-world PASS
json-parse PASS

Overall: PASS

Run output

hello-world:

Hello, World!

json-parse:

{
  "Name": "AWF Test",
  "Version": 1,
  "Success": true
}
Name: AWF Test, Success: True

Generated by Build Test .NET for issue #1072

@github-actions
Copy link
Contributor

Java Build Test Results

Project Compile Tests Status
gson 1/1 PASS
caffeine 1/1 PASS

Overall: ✅ PASS

Generated by Build Test Java for issue #1072

@github-actions
Copy link
Contributor

Chroot Version Comparison Results

Runtime Host Version Chroot Version Match?
Python Python 3.12.12 Python 3.12.3
Node.js v24.13.1 v20.20.0
Go go1.22.12 go1.22.12

Result: ⚠️ Some versions differ between host and chroot environments. Go matches, but Python and Node.js versions differ.

Tested by Smoke Chroot for issue #1072

…1078)

* Initial plan

* fix: add explicit execute directive to smoke-codex to prevent noop

Co-authored-by: lpcox <15877973+lpcox@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: lpcox <15877973+lpcox@users.noreply.github.com>
@lpcox
Copy link
Collaborator

lpcox commented Feb 27, 2026

@claude[agent] can you fix the pr title and summary?

@github-actions
Copy link
Contributor

Deno Build Test Results

Project Tests Status
oak 1/1 ✅ PASS
std 1/1 ✅ PASS

Overall: ✅ PASS

Generated by Build Test Deno for issue #1072

@github-actions
Copy link
Contributor

Build Test: Bun Results

Project Install Tests Status
elysia 1/1 PASS
hono 1/1 PASS

Overall: PASS

Bun version: 1.3.10

Generated by Build Test Bun for issue #1072

@github-actions
Copy link
Contributor

Smoke Test Results — Copilot Engine

Test Result
GitHub MCP (last 2 merged PRs) #1078 "fix: add explicit execute directive to smoke-codex to prevent noop", #1070 "chore: investigate issue duplication detector workflow failure"
Playwright (github.com title) ✅ Title contains "GitHub"
File write /tmp/gh-aw/agent/smoke-test-copilot-22469204757.txt created
Bash verify ✅ File content confirmed

Overall: PASS

PR author: @lpcox | No assignees.

📰 BREAKING: Report filed by Smoke Copilot for issue #1072

@github-actions
Copy link
Contributor

Smoke Test Results

✅ GitHub MCP: #1078 fix: add explicit execute directive to smoke-codex to prevent noop / #1069 fix(deps): resolve high-severity rollup vulnerability in docs-site
✅ Playwright: github.com title contains "GitHub"
✅ File Write: /tmp/gh-aw/agent/smoke-test-claude-22469204754.txt created
✅ Bash: File verified via cat

Overall: PASS

💥 [THE END] — Illustrated by Smoke Claude for issue #1072

@github-actions
Copy link
Contributor

Node.js Build Test Results

Project Install Tests Status
clsx ✅ All passed PASS
execa ✅ All passed PASS
p-limit ✅ All passed PASS

Overall: ✅ PASS

Generated by Build Test Node.js for issue #1072

@github-actions
Copy link
Contributor

Go Build Test Results

Project Download Tests Status
color PASS ✅ PASS
env PASS ✅ PASS
uuid PASS ✅ PASS

Overall: ✅ PASS

Generated by Build Test Go for issue #1072

@github-actions
Copy link
Contributor

C++ Build Test Results

Project CMake Build Status
fmt PASS
json PASS

Overall: PASS 🎉

All C++ projects configured and built successfully.

Generated by Build Test C++ for issue #1072

@Claude
Copy link
Contributor Author

Claude AI commented Feb 27, 2026

@claude[agent] can you fix the pr title and summary?

Updated PR title to "fix(api-proxy): derive api.subdomain.ghe.com for GHEC domains" and added comprehensive description covering the automatic endpoint derivation feature, test refactoring, and documentation improvements.

@github-actions
Copy link
Contributor

Rust Build Test Results

Project Build Tests Status
fd 1/1 PASS
zoxide 1/1 PASS

Overall: PASS

Generated by Build Test Rust for issue #1072

@github-actions
Copy link
Contributor

.NET Build Test Results

Project Restore Build Run Status
hello-world PASS
json-parse PASS

Overall: PASS

Run output

hello-world:

Hello, World!
```

**json-parse:**
```
{
  "Name": "AWF Test",
  "Version": 1,
  "Success": true
}
Name: AWF Test, Success: True

Generated by Build Test .NET for issue #1072

@Claude Claude AI changed the title Addressing PR comments fix(api-proxy): derive api.subdomain.ghe.com for GHEC domains Feb 27, 2026
@github-actions
Copy link
Contributor

Java Build Test Results

Project Compile Tests Status
gson 1/1 PASS
caffeine 1/1 PASS

Overall: PASS

All projects compiled and all tests passed successfully.

Generated by Build Test Java for issue #1072

@github-actions
Copy link
Contributor

Chroot Version Comparison Results

Runtime Host Version Chroot Version Match?
Python Python 3.12.12 Python 3.12.3 ❌ NO
Node.js v24.13.1 v20.20.0 ❌ NO
Go go1.22.12 go1.22.12 ✅ YES

Result: ❌ Not all tests passed — Python and Node.js versions differ between host and chroot environments.

Tested by Smoke Chroot for issue #1072

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants