@@ -30,6 +30,7 @@ import (
30
30
"github.com/codeclysm/extract/v3"
31
31
"github.com/sirupsen/logrus"
32
32
"gopkg.in/src-d/go-git.v4"
33
+ "gopkg.in/src-d/go-git.v4/plumbing"
33
34
)
34
35
35
36
type alreadyInstalledError struct {}
@@ -190,7 +191,7 @@ func (lm *LibrariesManager) InstallGitLib(gitURL string, overwrite bool) error {
190
191
return fmt .Errorf (tr ("User directory not set" ))
191
192
}
192
193
193
- libraryName , err := parseGitURL (gitURL )
194
+ libraryName , ref , err := parseGitURL (gitURL )
194
195
if err != nil {
195
196
logrus .
196
197
WithError (err ).
@@ -218,9 +219,13 @@ func (lm *LibrariesManager) InstallGitLib(gitURL string, overwrite bool) error {
218
219
WithField ("git url" , gitURL ).
219
220
Trace ("Installing library" )
220
221
221
- _ , err = git .PlainClone (installPath .String (), false , & git.CloneOptions {
222
+ depth := 1
223
+ if ref != "" {
224
+ depth = 0
225
+ }
226
+ repo , err := git .PlainClone (installPath .String (), false , & git.CloneOptions {
222
227
URL : gitURL ,
223
- Depth : 1 ,
228
+ Depth : depth ,
224
229
Progress : os .Stdout ,
225
230
})
226
231
if err != nil {
@@ -230,6 +235,25 @@ func (lm *LibrariesManager) InstallGitLib(gitURL string, overwrite bool) error {
230
235
return err
231
236
}
232
237
238
+ if ref != "" {
239
+ if h , err := repo .ResolveRevision (ref ); err != nil {
240
+ logrus .
241
+ WithError (err ).
242
+ Warnf ("Resolving revision %s" , ref )
243
+ return err
244
+ } else if w , err := repo .Worktree (); err != nil {
245
+ logrus .
246
+ WithError (err ).
247
+ Warn ("Finding worktree" )
248
+ return err
249
+ } else if err := w .Checkout (& git.CheckoutOptions {Hash : plumbing .NewHash (h .String ())}); err != nil {
250
+ logrus .
251
+ WithError (err ).
252
+ Warnf ("Checking out %s" , h )
253
+ return err
254
+ }
255
+ }
256
+
233
257
if err := validateLibrary (installPath ); err != nil {
234
258
// Clean up installation directory since this is not a valid library
235
259
installPath .RemoveAll ()
@@ -243,8 +267,9 @@ func (lm *LibrariesManager) InstallGitLib(gitURL string, overwrite bool) error {
243
267
244
268
// parseGitURL tries to recover a library name from a git URL.
245
269
// Returns an error in case the URL is not a valid git URL.
246
- func parseGitURL (gitURL string ) (string , error ) {
270
+ func parseGitURL (gitURL string ) (string , plumbing. Revision , error ) {
247
271
var res string
272
+ var rev plumbing.Revision
248
273
if strings .HasPrefix (gitURL , "git@" ) {
249
274
// We can't parse these as URLs
250
275
i := strings .LastIndex (gitURL , "/" )
@@ -254,10 +279,11 @@ func parseGitURL(gitURL string) (string, error) {
254
279
} else if parsed , err := url .Parse (gitURL ); parsed .String () != "" && err == nil {
255
280
i := strings .LastIndex (parsed .Path , "/" )
256
281
res = strings .TrimSuffix (parsed .Path [i + 1 :], ".git" )
282
+ rev = plumbing .Revision (parsed .Fragment )
257
283
} else {
258
- return "" , fmt .Errorf (tr ("invalid git url" ))
284
+ return "" , "" , fmt .Errorf (tr ("invalid git url" ))
259
285
}
260
- return res , nil
286
+ return res , rev , nil
261
287
}
262
288
263
289
// validateLibrary verifies the dir contains a valid library, meaning it has either
0 commit comments