2014-07-26 08:24:27 +04:00
// Copyright 2014 The Gogs Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
package git
import (
"errors"
"strings"
"github.com/Unknwon/com"
)
2014-09-16 18:10:33 +04:00
var (
// Cached Git version.
gitVer * Version
)
2014-07-26 08:24:27 +04:00
// Version represents version of Git.
type Version struct {
Major , Minor , Patch int
}
2014-09-16 18:10:33 +04:00
func ParseVersion ( verStr string ) ( * Version , error ) {
infos := strings . Split ( verStr , "." )
2014-07-26 08:24:27 +04:00
if len ( infos ) < 3 {
2014-09-16 18:10:33 +04:00
return nil , errors . New ( "incorrect version input" )
2014-07-26 08:24:27 +04:00
}
2014-09-16 18:10:33 +04:00
v := & Version { }
for i , s := range infos {
2014-07-26 08:24:27 +04:00
switch i {
case 0 :
v . Major , _ = com . StrTo ( s ) . Int ( )
case 1 :
v . Minor , _ = com . StrTo ( s ) . Int ( )
case 2 :
v . Patch , _ = com . StrTo ( s ) . Int ( )
}
}
return v , nil
}
2014-09-16 18:10:33 +04:00
func MustParseVersion ( verStr string ) * Version {
v , _ := ParseVersion ( verStr )
return v
}
// Compare compares two versions,
// it returns 1 if original is greater, 1 if original is smaller, 0 if equal.
func ( v * Version ) Compare ( that * Version ) int {
if v . Major > that . Major {
return 1
} else if v . Major < that . Major {
return - 1
}
if v . Minor > that . Minor {
return 1
} else if v . Minor < that . Minor {
return - 1
}
if v . Patch > that . Patch {
return 1
} else if v . Patch < that . Patch {
return - 1
}
return 0
}
// GetVersion returns current Git version installed.
func GetVersion ( ) ( * Version , error ) {
if gitVer != nil {
return gitVer , nil
}
stdout , stderr , err := com . ExecCmd ( "git" , "version" )
if err != nil {
return nil , errors . New ( stderr )
}
infos := strings . Split ( stdout , " " )
if len ( infos ) < 3 {
return nil , errors . New ( "not enough output" )
}
gitVer , err = ParseVersion ( infos [ 2 ] )
return gitVer , err
}