4
4
"errors"
5
5
"fmt"
6
6
"io"
7
+ "io/ioutil"
7
8
"os"
8
9
"os/exec"
9
10
"os/user"
@@ -77,16 +78,22 @@ func execHab(pkgName string, pkgVersion string, habChannel string, command []str
77
78
return verErr
78
79
}
79
80
80
- installCmd := []string {habPath , "pkg" , "install" , pkg , "-c" , habChannel , ">/dev/null" }
81
- if u , userErr := user .Current (); userErr != nil || u .Uid != "0" {
82
- // execute sudo command if not root user
83
- installCmd = append ([]string {"sudo" }, installCmd ... )
84
- }
81
+ // Check if the desired version of the package exists
82
+ checkCmd := habPath + " pkg path " + pkg + " >/dev/null 2>&1"
83
+ checkCmdResult := runCommand (checkCmd , output )
84
+
85
+ if checkCmdResult != nil {
86
+ installCmd := []string {habPath , "pkg" , "install" , pkg , "-c" , habChannel , ">/dev/null" }
87
+ if u , userErr := user .Current (); userErr != nil || u .Uid != "0" {
88
+ // execute sudo command if not root user
89
+ installCmd = append ([]string {"sudo" }, installCmd ... )
90
+ }
85
91
86
- unwrappedInstallCommand := strings .Join (installCmd , " " )
87
- installErr := runCommand (unwrappedInstallCommand , output )
88
- if installErr != nil {
89
- return installErr
92
+ unwrappedInstallCommand := strings .Join (installCmd , " " )
93
+ installErr := runCommand (unwrappedInstallCommand , output )
94
+ if installErr != nil {
95
+ return installErr
96
+ }
90
97
}
91
98
92
99
execCmd := []string {habPath , "pkg" , "exec" , pkg }
@@ -109,7 +116,15 @@ func getPackageVersion(depot hab.Depot, pkgName, pkgVerExp string, habChannel st
109
116
110
117
foundVersions , err := depot .PackageVersionsFromName (pkgName , habChannel )
111
118
if err != nil {
112
- return "" , fmt .Errorf ("Failed to fetch package versions: %v" , err )
119
+ fmt .Fprintf (os .Stderr , "ERROR: Unable to access to Habitat depot API. %v\n " +
120
+ "Trying to fetch versions from installed packages...\n " , err )
121
+ dirs , err := ioutil .ReadDir ("/hab/pkgs/" + pkgName )
122
+ if err != nil {
123
+ return "" , errors .New ("The specified version not found" )
124
+ }
125
+ for _ , dir := range dirs {
126
+ foundVersions = append (foundVersions , dir .Name ())
127
+ }
113
128
}
114
129
115
130
var versions []* semver.Version
@@ -143,6 +158,8 @@ func main() {
143
158
144
159
var pkgVerExp string
145
160
var habChannel string
161
+ var pkgVersion string
162
+ var err error
146
163
147
164
app := cli .NewApp ()
148
165
app .Name = "sd-step"
@@ -182,10 +199,13 @@ func main() {
182
199
pkgName := c .Args ().Get (0 )
183
200
184
201
depot := hab .New (habDepotURL )
185
- pkgVersion , err := getPackageVersion (depot , pkgName , pkgVerExp , habChannel )
186
202
187
- if err != nil {
188
- failureExit (fmt .Errorf ("Failed to get package version: %v" , err ))
203
+ if pkgVerExp != "" {
204
+ pkgVersion , err = getPackageVersion (depot , pkgName , pkgVerExp , habChannel )
205
+
206
+ if err != nil {
207
+ failureExit (fmt .Errorf ("Failed to get package version: %v" , err ))
208
+ }
189
209
}
190
210
191
211
err = execHab (pkgName , pkgVersion , habChannel , c .Args ().Tail (), os .Stdout )
0 commit comments