Fix rust build on windows (#2019)
This pull request implements a fix from #2000, as well as fixed an additional problem with path lengths on windows that prevents the login from displaying. --------- Co-authored-by: Michael Bolin <bolinfest@gmail.com> Co-authored-by: Michael Bolin <mbolin@openai.com>
This commit is contained in:
@@ -12,6 +12,7 @@ chrono = { version = "0.4", features = ["serde"] }
|
|||||||
reqwest = { version = "0.12", features = ["json"] }
|
reqwest = { version = "0.12", features = ["json"] }
|
||||||
serde = { version = "1", features = ["derive"] }
|
serde = { version = "1", features = ["derive"] }
|
||||||
serde_json = "1"
|
serde_json = "1"
|
||||||
|
tempfile = "3"
|
||||||
thiserror = "2.0.12"
|
thiserror = "2.0.12"
|
||||||
tokio = { version = "1", features = [
|
tokio = { version = "1", features = [
|
||||||
"io-std",
|
"io-std",
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ use std::process::Stdio;
|
|||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use std::sync::Mutex;
|
use std::sync::Mutex;
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
|
use tempfile::NamedTempFile;
|
||||||
use tokio::process::Command;
|
use tokio::process::Command;
|
||||||
|
|
||||||
pub use crate::token_data::TokenData;
|
pub use crate::token_data::TokenData;
|
||||||
@@ -263,9 +264,9 @@ pub struct SpawnedLogin {
|
|||||||
|
|
||||||
/// Spawn the ChatGPT login Python server as a child process and return a handle to its process.
|
/// Spawn the ChatGPT login Python server as a child process and return a handle to its process.
|
||||||
pub fn spawn_login_with_chatgpt(codex_home: &Path) -> std::io::Result<SpawnedLogin> {
|
pub fn spawn_login_with_chatgpt(codex_home: &Path) -> std::io::Result<SpawnedLogin> {
|
||||||
|
let script_path = write_login_script_to_disk()?;
|
||||||
let mut cmd = std::process::Command::new("python3");
|
let mut cmd = std::process::Command::new("python3");
|
||||||
cmd.arg("-c")
|
cmd.arg(&script_path)
|
||||||
.arg(SOURCE_FOR_PYTHON_SERVER)
|
|
||||||
.env("CODEX_HOME", codex_home)
|
.env("CODEX_HOME", codex_home)
|
||||||
.env("CODEX_CLIENT_ID", CLIENT_ID)
|
.env("CODEX_CLIENT_ID", CLIENT_ID)
|
||||||
.stdin(Stdio::null())
|
.stdin(Stdio::null())
|
||||||
@@ -315,9 +316,9 @@ pub fn spawn_login_with_chatgpt(codex_home: &Path) -> std::io::Result<SpawnedLog
|
|||||||
/// recorded in memory. Otherwise, the subprocess's output will be sent to the
|
/// recorded in memory. Otherwise, the subprocess's output will be sent to the
|
||||||
/// current process's stdout/stderr.
|
/// current process's stdout/stderr.
|
||||||
pub async fn login_with_chatgpt(codex_home: &Path, capture_output: bool) -> std::io::Result<()> {
|
pub async fn login_with_chatgpt(codex_home: &Path, capture_output: bool) -> std::io::Result<()> {
|
||||||
|
let script_path = write_login_script_to_disk()?;
|
||||||
let child = Command::new("python3")
|
let child = Command::new("python3")
|
||||||
.arg("-c")
|
.arg(&script_path)
|
||||||
.arg(SOURCE_FOR_PYTHON_SERVER)
|
|
||||||
.env("CODEX_HOME", codex_home)
|
.env("CODEX_HOME", codex_home)
|
||||||
.env("CODEX_CLIENT_ID", CLIENT_ID)
|
.env("CODEX_CLIENT_ID", CLIENT_ID)
|
||||||
.stdin(Stdio::null())
|
.stdin(Stdio::null())
|
||||||
@@ -344,6 +345,17 @@ pub async fn login_with_chatgpt(codex_home: &Path, capture_output: bool) -> std:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn write_login_script_to_disk() -> std::io::Result<PathBuf> {
|
||||||
|
// Write the embedded Python script to a file to avoid very long
|
||||||
|
// command-line arguments (Windows error 206).
|
||||||
|
let mut tmp = NamedTempFile::new()?;
|
||||||
|
tmp.write_all(SOURCE_FOR_PYTHON_SERVER.as_bytes())?;
|
||||||
|
tmp.flush()?;
|
||||||
|
|
||||||
|
let (_file, path) = tmp.keep()?;
|
||||||
|
Ok(path)
|
||||||
|
}
|
||||||
|
|
||||||
pub fn login_with_api_key(codex_home: &Path, api_key: &str) -> std::io::Result<()> {
|
pub fn login_with_api_key(codex_home: &Path, api_key: &str) -> std::io::Result<()> {
|
||||||
let auth_dot_json = AuthDotJson {
|
let auth_dot_json = AuthDotJson {
|
||||||
openai_api_key: Some(api_key.to_string()),
|
openai_api_key: Some(api_key.to_string()),
|
||||||
|
|||||||
@@ -29,14 +29,17 @@ pub fn init(_config: &Config) -> Result<Tui> {
|
|||||||
// Enable keyboard enhancement flags so modifiers for keys like Enter are disambiguated.
|
// Enable keyboard enhancement flags so modifiers for keys like Enter are disambiguated.
|
||||||
// chat_composer.rs is using a keyboard event listener to enter for any modified keys
|
// chat_composer.rs is using a keyboard event listener to enter for any modified keys
|
||||||
// to create a new line that require this.
|
// to create a new line that require this.
|
||||||
execute!(
|
// Some terminals (notably legacy Windows consoles) do not support
|
||||||
|
// keyboard enhancement flags. Attempt to enable them, but continue
|
||||||
|
// gracefully if unsupported.
|
||||||
|
let _ = execute!(
|
||||||
stdout(),
|
stdout(),
|
||||||
PushKeyboardEnhancementFlags(
|
PushKeyboardEnhancementFlags(
|
||||||
KeyboardEnhancementFlags::DISAMBIGUATE_ESCAPE_CODES
|
KeyboardEnhancementFlags::DISAMBIGUATE_ESCAPE_CODES
|
||||||
| KeyboardEnhancementFlags::REPORT_EVENT_TYPES
|
| KeyboardEnhancementFlags::REPORT_EVENT_TYPES
|
||||||
| KeyboardEnhancementFlags::REPORT_ALTERNATE_KEYS
|
| KeyboardEnhancementFlags::REPORT_ALTERNATE_KEYS
|
||||||
)
|
)
|
||||||
)?;
|
);
|
||||||
set_panic_hook();
|
set_panic_hook();
|
||||||
|
|
||||||
// Clear screen and move cursor to top-left before drawing UI
|
// Clear screen and move cursor to top-left before drawing UI
|
||||||
@@ -57,7 +60,8 @@ fn set_panic_hook() {
|
|||||||
|
|
||||||
/// Restore the terminal to its original state
|
/// Restore the terminal to its original state
|
||||||
pub fn restore() -> Result<()> {
|
pub fn restore() -> Result<()> {
|
||||||
execute!(stdout(), PopKeyboardEnhancementFlags)?;
|
// Pop may fail on platforms that didn't support the push; ignore errors.
|
||||||
|
let _ = execute!(stdout(), PopKeyboardEnhancementFlags);
|
||||||
execute!(stdout(), DisableBracketedPaste)?;
|
execute!(stdout(), DisableBracketedPaste)?;
|
||||||
disable_raw_mode()?;
|
disable_raw_mode()?;
|
||||||
Ok(())
|
Ok(())
|
||||||
|
|||||||
Reference in New Issue
Block a user