From 9333c504c12b76d1577e478e5e013b37e211ae7f Mon Sep 17 00:00:00 2001
From: Matt Bell <mappum@gmail.com>
Date: Sun, 16 Nov 2014 23:56:21 -0800
Subject: [PATCH] commands/cli,http: Make sure required file arguments are
 provided

---
 commands/cli/parse.go  | 7 +++++++
 commands/http/parse.go | 9 +++++++++
 2 files changed, 16 insertions(+)

diff --git a/commands/cli/parse.go b/commands/cli/parse.go
index 1f00c3161..c6cb81ae4 100644
--- a/commands/cli/parse.go
+++ b/commands/cli/parse.go
@@ -248,6 +248,13 @@ func parseArgs(inputs []string, stdin *os.File, argDefs []cmds.Argument, recursi
 		argDefIndex++
 	}
 
+	// check to make sure we didn't miss any required arguments
+	for _, argDef := range argDefs[argDefIndex:] {
+		if argDef.Required {
+			return nil, nil, fmt.Errorf("Argument '%s' is required", argDef.Name)
+		}
+	}
+
 	return stringArgs, fileArgs, nil
 }
 
diff --git a/commands/http/parse.go b/commands/http/parse.go
index d2d8725b6..b8aa9c7e5 100644
--- a/commands/http/parse.go
+++ b/commands/http/parse.go
@@ -2,6 +2,7 @@ package http
 
 import (
 	"errors"
+	"fmt"
 	"mime"
 	"net/http"
 	"strings"
@@ -54,6 +55,7 @@ func Parse(r *http.Request, root *cmds.Command) (cmds.Request, error) {
 	args := make([]string, valCount)
 
 	valIndex := 0
+	requiredFile := ""
 	for _, argDef := range cmd.Arguments {
 		// skip optional argument definitions if there aren't sufficient remaining values
 		if valCount-valIndex <= numRequired && !argDef.Required {
@@ -78,6 +80,8 @@ func Parse(r *http.Request, root *cmds.Command) (cmds.Request, error) {
 			} else {
 				break
 			}
+		} else if argDef.Type == cmds.ArgFile && argDef.Required && len(requiredFile) == 0 {
+			requiredFile = argDef.Name
 		}
 	}
 
@@ -101,6 +105,11 @@ func Parse(r *http.Request, root *cmds.Command) (cmds.Request, error) {
 		}
 	}
 
+	// if there is a required filearg, error if no files were provided
+	if len(requiredFile) > 0 && f == nil {
+		return nil, fmt.Errorf("File argument '%s' is required", requiredFile)
+	}
+
 	req, err := cmds.NewRequest(path, opts, args, f, cmd, optDefs)
 	if err != nil {
 		return nil, err
-- 
GitLab