@@ -139,28 +139,27 @@ var upCmd = &cobra.Command{
139139 RunE : func (cmd * cobra.Command , args []string ) error {
140140 ctx := cmd .Context ()
141141 cfg := getConfig ()
142+ pres := getPresenter ()
142143
143144 logger , err := getLogger (cfg )
144145 if err != nil {
145146 return fmt .Errorf ("ロガーの初期化に失敗しました: %w" , err )
146147 }
147148
148- // ポート設定の作成(設定ファイルの値をベースに、CLIオプションで上書き)
149149 portConfig , err := createPortConfig (portRange , cfg .GetPort ())
150150 if err != nil {
151151 return fmt .Errorf ("ポート範囲の解析に失敗しました: %w" , err )
152152 }
153153
154- // -p オプションが指定されていない場合は、ワークツリー名をプロジェクト名として自動設定
155154 if composeProjectName == "" && os .Getenv ("COMPOSE_PROJECT_NAME" ) == "" {
156155 if pn , err := detectWorktreeProjectName (); err == nil && pn != "" {
157156 composeProjectName = pn
158- logger .Info (ctx , "ワークツリー名をプロジェクト名として使用" ,
157+ logger .Debug (ctx , "ワークツリー名をプロジェクト名として使用" ,
159158 types.Field {Key : "project_name" , Value : composeProjectName })
160159 }
161160 }
162161
163- logger .Info (ctx , "ポート衝突解決を開始" ,
162+ logger .Debug (ctx , "ポート衝突解決を開始" ,
164163 types.Field {Key : "dry_run" , Value : dryRun },
165164 types.Field {Key : "compose_file" , Value : filePath },
166165 types.Field {Key : "output_file" , Value : outputFile },
@@ -171,7 +170,7 @@ var upCmd = &cobra.Command{
171170
172171 // Docker Composeファイルの自動検出(指定されていない場合)
173172 if filePath == "" || filePath == "compose.yml" {
174- wd , err := os .Getwd ()
173+ wd , err := os .Getwd ()
175174 if err != nil {
176175 return fmt .Errorf ("作業ディレクトリの取得に失敗: %w" , err )
177176 }
@@ -182,7 +181,7 @@ var upCmd = &cobra.Command{
182181 return fmt .Errorf ("docker composeファイルの自動検出に失敗: %w" , err )
183182 }
184183 filePath = detectedFile
185- logger .Info (ctx , "Docker Composeファイルを自動検出" , types.Field {Key : "file" , Value : filePath })
184+ logger .Debug (ctx , "Docker Composeファイルを自動検出" , types.Field {Key : "file" , Value : filePath })
186185 }
187186
188187 // Docker Composeファイルの解析
@@ -192,6 +191,8 @@ var upCmd = &cobra.Command{
192191 return fmt .Errorf ("docker composeファイルの解析に失敗: %w" , err )
193192 }
194193
194+ pres .Progress ("Scanning..." )
195+
195196 // 統一的な衝突検知の実行
196197 portDetector := scanner .NewNetstatPortDetector (logger )
197198 portAllocator := scanner .NewPortAllocatorImpl (portDetector , logger )
@@ -205,15 +206,15 @@ var upCmd = &cobra.Command{
205206
206207 // 衝突がない場合
207208 if ! conflictInfo .HasConflicts () {
208- logger .Info (ctx , "衝突は検出されませんでした" )
209- if skipComposeUp {
210- logger .Warn (ctx , "--skip-compose-upオプションは不要になりました。デフォルトでdocker compose upは実行されません。" )
211- }
209+ pres .PortConflicts (nil )
210+ pres .NetworkConflicts (nil )
211+ pres .Result ("No conflicts detected." )
212212 return nil
213213 }
214214
215- // 衝突結果の表示
216- logger .Info (ctx , "衝突検知完了" ,
215+ pres .Progress ("Resolving..." )
216+
217+ logger .Debug (ctx , "衝突検知完了" ,
217218 types.Field {Key : "port_conflicts" , Value : len (conflictInfo .PortConflicts )},
218219 types.Field {Key : "network_conflicts" , Value : len (conflictInfo .NetworkConflicts )})
219220
@@ -234,34 +235,17 @@ var upCmd = &cobra.Command{
234235 return fmt .Errorf ("衝突解決に失敗: %w" , err )
235236 }
236237
237- // 解決結果の表示
238- for _ , conflict := range conflictInfo .PortConflicts {
239- if conflict .Resolution != nil {
240- logger .Info (ctx , "ポート解決" ,
241- types.Field {Key : "service" , Value : conflict .ServiceName },
242- types.Field {Key : "from" , Value : conflict .Port },
243- types.Field {Key : "to" , Value : conflict .Resolution .ResolvedPort },
244- types.Field {Key : "reason" , Value : conflict .Resolution .Reason })
245- }
246- }
247-
248- for _ , conflict := range conflictInfo .NetworkConflicts {
249- if conflict .Resolution != nil {
250- logger .Info (ctx , "ネットワーク解決" ,
251- types.Field {Key : "network" , Value : conflict .NetworkName },
252- types.Field {Key : "from" , Value : conflict .OriginalSubnet },
253- types.Field {Key : "to" , Value : conflict .Resolution .ResolvedSubnet },
254- types.Field {Key : "reason" , Value : conflict .Resolution .Reason })
255- }
256- }
238+ // 衝突回避結果のテーブル表示
239+ pres .PortConflicts (conflictInfo .PortConflicts )
240+ pres .NetworkConflicts (conflictInfo .NetworkConflicts )
257241
258242 // 統一的なOverride.ymlの生成
259243 override , err := unifiedGenerator .GenerateFromConflicts (ctx , config , conflictInfo )
260244 if err != nil {
261245 return fmt .Errorf ("overrideファイルの生成に失敗: %w" , err )
262246 }
263247
264- // プロジェクト名をoverrideに設定(Docker Composeコマンドの統一のため)
248+ // プロジェクト名をoverrideに設定
265249 if composeProjectName != "" {
266250 override .Name = composeProjectName
267251 logger .Debug (ctx , "Override.ymlにプロジェクト名を設定" ,
@@ -279,29 +263,18 @@ var upCmd = &cobra.Command{
279263 outputFile = "compose.override.yml"
280264 }
281265
282- // ドライランモードでない場合のみファイル書き込み
283- if ! dryRun {
284- // Override.ymlファイルの書き込み
285- if err := overrideGenerator .WriteOverrideFile (ctx , override , outputFile ); err != nil {
286- return fmt .Errorf ("overrideファイルの書き込みに失敗: %w" , err )
287- }
288-
289- logger .Info (ctx , "Override.ymlファイルが生成されました" ,
290- types.Field {Key : "output_file" , Value : outputFile })
291- } else {
292- logger .Info (ctx , "ドライランモードのため、ファイルは生成されません" )
293- }
294-
295- // Docker Composeの実行(--skip-compose-upが指定された場合は後方互換のための警告を表示)
296- if skipComposeUp {
297- logger .Warn (ctx , "--skip-compose-upオプションは不要になりました。デフォルトでdocker compose upは実行されません。" )
266+ // ドライランモードの場合
267+ if dryRun {
268+ pres .Result ("Dry run: no files written." )
269+ return nil
298270 }
299271
300- // デフォルトではDocker Composeを実行しない
301- if ! dryRun {
302- logger . Info ( ctx , "override.ymlの生成が完了しました。docker compose upを実行する場合は、手動で実行してください。" )
272+ // Override.ymlファイルの書き込み
273+ if err := overrideGenerator . WriteOverrideFile ( ctx , override , outputFile ); err != nil {
274+ return fmt . Errorf ( "overrideファイルの書き込みに失敗: %w" , err )
303275 }
304276
277+ pres .Result ("Generated: " + outputFile )
305278 return nil
306279 },
307280}
0 commit comments