Skip to content

Commit 702ae2c

Browse files
committed
test message
1 parent e50334f commit 702ae2c

2 files changed

Lines changed: 38 additions & 23 deletions

File tree

cmd/interactive.go

Lines changed: 36 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ func NewUI() *UI {
5353
}
5454

5555
var commands = []CommandInfo{
56+
{"help", "Show help message"},
5657
{"add <file>", "Add a specific file to the index"},
5758
{"add .", "Add all changes to index"},
5859
{"add -p", "Add changes interactively"},
@@ -100,9 +101,9 @@ var commands = []CommandInfo{
100101
{"status short", "Show concise status (porcelain format)"},
101102
{"rebase interactive", "Interactive rebase"},
102103
{"remote list", "List all remote repositories"},
103-
{"remote add <name> <url>", "Add remote repository"},
104-
{"remote remove <name>", "Remove remote repository"},
105-
{"remote set-url <name> <url>", "Change remote URL"},
104+
{"remote add <n> <url>", "Add remote repository"},
105+
{"remote remove <n>", "Remove remote repository"},
106+
{"remote set-url <n> <url>", "Change remote URL"},
106107
{"quit", "Exit interactive mode"},
107108
}
108109

@@ -115,33 +116,36 @@ func InteractiveUI() []string {
115116

116117
// Run executes the interactive UI
117118
func (ui *UI) Run() []string {
118-
fd := int(os.Stdin.Fd())
119-
oldState, err := ui.term.makeRaw(fd)
120-
if err != nil {
121-
fmt.Fprintln(ui.stderr, "Failed to set terminal to raw mode:", err)
122-
return nil
123-
}
124-
defer func() {
125-
if err := ui.term.restore(fd, oldState); err != nil {
126-
fmt.Fprintln(ui.stderr, "failed to restore terminal state:", err)
119+
// ターミナルの生モード設定は標準入力がターミナルの場合のみ行う
120+
var oldState *term.State
121+
if f, ok := ui.stdin.(*os.File); ok {
122+
fd := int(f.Fd())
123+
var err error
124+
oldState, err = ui.term.makeRaw(fd)
125+
if err != nil {
126+
fmt.Fprintln(ui.stderr, "Failed to set terminal to raw mode:", err)
127+
return nil
127128
}
128-
}()
129+
defer func() {
130+
if err := ui.term.restore(fd, oldState); err != nil {
131+
fmt.Fprintln(ui.stderr, "failed to restore terminal state:", err)
132+
}
133+
}()
134+
}
129135

130136
reader := bufio.NewReader(ui.stdin)
131137
selected := 0
132138
input := ""
133139

134140
for {
135-
if _, err := fmt.Fprint(ui.stdout, "\033[H\033[2J\033[H"); err != nil {
136-
fmt.Fprintln(ui.stderr, "failed to write clear screen sequence:", err)
137-
}
141+
fmt.Fprint(ui.stdout, "\033[H\033[2J\033[H") // Clear screen
138142
fmt.Fprintf(ui.stdout, "Select a command (incremental search: type to filter, ctrl+n: down, ctrl+p: up, enter: execute, ctrl+c: quit)\n")
139143
fmt.Fprintf(ui.stdout, "\rSearch: %s\n\n", input)
140144

141145
// Filtering
142146
filtered := []CommandInfo{}
143147
for _, cmd := range commands {
144-
if strings.Contains(cmd.Command, input) {
148+
if strings.HasPrefix(cmd.Command, input) {
145149
filtered = append(filtered, cmd)
146150
}
147151
}
@@ -182,11 +186,18 @@ func (ui *UI) Run() []string {
182186

183187
b, err := reader.ReadByte()
184188
if err != nil {
189+
if err == io.EOF {
190+
return nil
191+
}
185192
continue
186193
}
187194
if b == 3 { // Ctrl+C in raw mode
188-
if err := ui.term.restore(fd, oldState); err != nil {
189-
fmt.Fprintln(ui.stderr, "failed to restore terminal state:", err)
195+
if oldState != nil {
196+
if f, ok := ui.stdin.(*os.File); ok {
197+
if err := ui.term.restore(int(f.Fd()), oldState); err != nil {
198+
fmt.Fprintln(ui.stderr, "failed to restore terminal state:", err)
199+
}
200+
}
190201
}
191202
fmt.Fprintln(ui.stdout, "\nExiting...")
192203
os.Exit(0)
@@ -196,8 +207,12 @@ func (ui *UI) Run() []string {
196207
}
197208
if len(filtered) > 0 {
198209
fmt.Fprintf(ui.stdout, "\nExecute: %s\n", filtered[selected].Command)
199-
if err := ui.term.restore(fd, oldState); err != nil {
200-
fmt.Fprintln(ui.stderr, "failed to restore terminal state:", err)
210+
if oldState != nil {
211+
if f, ok := ui.stdin.(*os.File); ok {
212+
if err := ui.term.restore(int(f.Fd()), oldState); err != nil {
213+
fmt.Fprintln(ui.stderr, "failed to restore terminal state:", err)
214+
}
215+
}
201216
}
202217
// Placeholder detection
203218
cmdTemplate := filtered[selected].Command

cmd/interactive_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,13 +60,13 @@ func TestUI_Run(t *testing.T) {
6060
},
6161
{
6262
name: "helpと入力してEnterを押した場合",
63-
input: []byte("help\r"),
63+
input: []byte{'h', 'e', 'l', 'p', 13}, // 'h','e','l','p' + Enter
6464
expectedArgs: []string{"ggc", "help"},
6565
expectNil: false,
6666
},
6767
{
6868
name: "存在しないコマンドを入力した場合",
69-
input: []byte("nonexistent\r"),
69+
input: []byte{'x', 'y', 'z', 13}, // 'x','y','z' + Enter
7070
expectNil: true,
7171
},
7272
}

0 commit comments

Comments
 (0)