From 616b476ce1051f113a91cb1636fd81d6d0a69f10 Mon Sep 17 00:00:00 2001 From: Grzegorz Dlugoszewski Date: Tue, 26 May 2020 21:35:57 +0200 Subject: [PATCH] [WIP] Replace git2go with go-git --- README.md | 7 +++ go.mod | 1 + go.sum | 21 +++++++- new/helpers_test.go | 125 ++++++++++++++++++++++++++++++++++++++++++++ new/repo.go | 8 +++ new/repo_test.go | 76 +++++++++++++++++++++++++++ new/status.go | 48 +++++++++++++++++ 7 files changed, 284 insertions(+), 2 deletions(-) create mode 100644 new/helpers_test.go create mode 100644 new/repo.go create mode 100644 new/repo_test.go create mode 100644 new/status.go diff --git a/README.md b/README.md index 1c670cb..95dd4f8 100644 --- a/README.md +++ b/README.md @@ -15,3 +15,10 @@ Show repo status: - ahead/behind? - submodules? + + +find upstream branch +https://github.com/src-d/go-git/issues/600 + +ahead/behind: +https://stackoverflow.com/questions/57566661/use-go-git-to-check-if-branch-has-been-pushed-to-remote diff --git a/go.mod b/go.mod index 340c0f5..2999160 100644 --- a/go.mod +++ b/go.mod @@ -3,6 +3,7 @@ module git-get go 1.14 require ( + github.com/go-git/go-billy/v5 v5.0.0 github.com/go-git/go-git/v5 v5.1.0 github.com/mitchellh/go-homedir v1.1.0 github.com/pkg/errors v0.9.1 diff --git a/go.sum b/go.sum index f6eb342..621ac75 100644 --- a/go.sum +++ b/go.sum @@ -1,11 +1,14 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7 h1:uSoVVbwJiQipAclBbw+8quDsfcvFjOpI5iCf4p/cqCs= github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7/go.mod h1:6zEj6s6u/ghQa61ZWa/C2Aw3RkjiTBOix7dkqa1VLIs= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239 h1:kFOfPq6dUM1hTo4JG6LR5AXSUEsOjtdm0kw0FtQtMJA= github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= @@ -19,22 +22,24 @@ github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfc github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg= github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= +github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568 h1:BHsljHzVlRcyQhjrss6TZTdY2VfCqZPbv5k3iBFa2ZQ= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gliderlabs/ssh v0.2.2 h1:6zsha5zo/TWhRhwqCD3+EarCAgZ2yN28ipRnGPnwkI0= github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= github.com/go-git/gcfg v1.5.0 h1:Q5ViNfGF8zFgyJWPqYwA7qGFoMTEiBmdlkcfRmpIMa4= github.com/go-git/gcfg v1.5.0/go.mod h1:5m20vg6GwYabIxaOonVkTdrILxQMpEShl1xiMF4ua+E= github.com/go-git/go-billy/v5 v5.0.0 h1:7NQHvd9FVid8VL4qVUMm8XifBK+2xCoZ2lSk0agRrHM= github.com/go-git/go-billy/v5 v5.0.0/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0= -github.com/go-git/go-git v1.0.0 h1:YcN9iDGDoXuIw0vHls6rINwV416HYa0EB2X+RBsyYp4= -github.com/go-git/go-git v4.7.0+incompatible h1:+W9rgGY4DOKKdX2x6HxSR7HNeTxqiKrOvKnuittYVdA= +github.com/go-git/go-git-fixtures/v4 v4.0.1 h1:q+IFMfLx200Q3scvt2hN79JsEzy4AmBTp/pqnefH+Bc= github.com/go-git/go-git-fixtures/v4 v4.0.1/go.mod h1:m+ICp2rF3jDhFgEZ/8yziagdT1C+ZpZcrJjappBCDSw= github.com/go-git/go-git/v5 v5.1.0 h1:HxJn9g/E7eYvKW3Fm7Jt4ee8LXfPOm/H1cdDu8vEssk= github.com/go-git/go-git/v5 v5.1.0/go.mod h1:ZKfuPUoY1ZqIG4QG9BDBh3G4gLM5zvPuSJAozQrZuyM= @@ -51,6 +56,7 @@ github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5y github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= @@ -76,7 +82,12 @@ github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFB github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/libgit2/git2go v0.28.4 h1:xfXnDnt31R2p7Yea7023C//NglM/1v+w87peBBwLZ3U= +github.com/libgit2/git2go v0.28.4/go.mod h1:4bKN42efkbNYMZlvDfxGDxzl066GhpvIircZDsm8Y+Y= +github.com/libgit2/git2go/v30 v30.0.3 h1:v+KRMhx85kHS0JzkPft7Wnt3+VUrYQrD/SQ77usTO/w= +github.com/libgit2/git2go/v30 v30.0.3/go.mod h1:YReiQ7xhMoyAL4ISYFLZt+OGqn6xtLqvTC1xJ9oAH7Y= github.com/magiconair/properties v1.8.0 h1:LLgXmsheXeRoUOBOjtwPQCWIYqM/LU1ayDtDePerRcY= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= @@ -85,6 +96,7 @@ github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrk github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc= @@ -93,6 +105,7 @@ github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= @@ -126,6 +139,7 @@ github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/y github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= @@ -168,6 +182,7 @@ golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527 h1:uYVVQ9WP/Ds2ROhcaGPeIdVq0 golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -182,6 +197,7 @@ gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLks gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= @@ -190,5 +206,6 @@ gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bl gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4 h1:/eiJrUcujPVeJ3xlSWaiNi3uSVmDGBK1pDHUHAnao1I= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/new/helpers_test.go b/new/helpers_test.go new file mode 100644 index 0000000..60e699a --- /dev/null +++ b/new/helpers_test.go @@ -0,0 +1,125 @@ +package new + +import ( + "testing" + "time" + + "github.com/go-git/go-git/v5/plumbing/object" + + "github.com/go-git/go-billy/v5/memfs" + "github.com/go-git/go-git/v5" + "github.com/go-git/go-git/v5/storage/memory" + "github.com/pkg/errors" + //"github.com/go-git/go-git/v5" +) + +func checkFatal(t *testing.T, err error) { + if err != nil { + t.Fatalf("%+v", err) + } +} + +//func newTempDir(t *testing.T) string { +// dir, err := ioutil.TempDir("", "git-get-repo-") +// checkFatal(t, errors.Wrap(err, "Failed creating test repo directory")) +// +// // Automatically remove repo when test is over +// t.Cleanup(func() { +// err := os.RemoveAll(dir) +// if err != nil { +// t.Errorf("failed cleaning up repo") +// } +// }) +// +// return dir +//} + +func newTestRepo(t *testing.T) *git.Repository { + fs := memfs.New() + storage := memory.NewStorage() + + repo, err := git.Init(storage, fs) + checkFatal(t, errors.Wrap(err, "Failed initializing a temp repo")) + + return repo +} + +func createFile(t *testing.T, repo *git.Repository, name string) { + wt, err := repo.Worktree() + checkFatal(t, errors.Wrap(err, "Failed getting worktree")) + + file, err := wt.Filesystem.Create(name) + checkFatal(t, errors.Wrap(err, "Failed creating a file")) + + _, err = file.Write([]byte("I'm a file")) + checkFatal(t, errors.Wrap(err, "Failed writing a file")) +} + +func stageFile(t *testing.T, repo *git.Repository, name string) { + wt, err := repo.Worktree() + checkFatal(t, errors.Wrap(err, "Failed getting worktree")) + + _, err = wt.Add(name) + checkFatal(t, errors.Wrap(err, "Failed adding file to index")) +} + +func createCommit(t *testing.T, repo *git.Repository, msg string) { + wt, err := repo.Worktree() + checkFatal(t, errors.Wrap(err, "Failed getting worktree")) + + opts := &git.CommitOptions{ + Author: &object.Signature{ + Name: "Some Guy", + Email: "someguy@example.com", + When: time.Date(2000, 01, 01, 16, 00, 00, 0, time.UTC), + }, + } + + _, err = wt.Commit(msg, opts) + checkFatal(t, errors.Wrap(err, "Failed creating commit")) +} + +// +//func createBranch(t *testing.T, repo *git.Repository, name string) *git.Branch { +// head, err := repo.Head() +// checkFatal(t, errors.Wrap(err, "Failed getting repo head")) +// +// commit, err := repo.LookupCommit(head.Target()) +// checkFatal(t, errors.Wrap(err, "Failed getting commit id from head")) +// +// branch, err := repo.CreateBranch(name, commit, false) +// checkFatal(t, errors.Wrap(err, "Failed creating branch")) +// +// return branch +//} +// +//func checkoutBranch(t *testing.T, repo *git.Repository, name string) { +// branch, err := repo.LookupBranch(name, git.BranchAll) +// +// // If branch can't be found, let's check if it's a remote branch +// if branch == nil { +// branch, err = repo.LookupBranch("origin/"+name, git.BranchAll) +// } +// checkFatal(t, errors.Wrap(err, "Failed looking up branch")) +// +// // If branch is remote, we need to create a local one first +// if branch.IsRemote() { +// commit, err := repo.LookupCommit(branch.Target()) +// checkFatal(t, errors.Wrap(err, "Failed looking up commit")) +// +// localBranch, err := repo.CreateBranch(name, commit, false) +// checkFatal(t, errors.Wrap(err, "Failed creating local branch")) +// +// err = localBranch.SetUpstream("origin/" + name) +// checkFatal(t, errors.Wrap(err, "Failed setting upstream")) +// } +// +// err = repo.SetHead("refs/heads/" + name) +// checkFatal(t, errors.Wrap(err, "Failed setting head")) +// +// options := &git.CheckoutOpts{ +// Strategy: git.CheckoutForce, +// } +// err = repo.CheckoutHead(options) +// checkFatal(t, errors.Wrap(err, "Failed checking out tree")) +//} diff --git a/new/repo.go b/new/repo.go new file mode 100644 index 0000000..5a37885 --- /dev/null +++ b/new/repo.go @@ -0,0 +1,8 @@ +package new + +import "github.com/go-git/go-git/v5" + +type Repo struct { + repo *git.Repository + Status *RepoStatus +} diff --git a/new/repo_test.go b/new/repo_test.go new file mode 100644 index 0000000..7838576 --- /dev/null +++ b/new/repo_test.go @@ -0,0 +1,76 @@ +package new + +import "testing" + +func TestRepoEmpty(t *testing.T) { + repo := newTestRepo(t) + + wt, err := repo.Worktree() + checkFatal(t, err) + + status, err := wt.Status() + if !status.IsClean() { + t.Errorf("Empty repo should be clean") + } +} + +func TestRepoWithUntrackedFile(t *testing.T) { + repo := newTestRepo(t) + createFile(t, repo, "file") + + wt, err := repo.Worktree() + checkFatal(t, err) + + status, err := wt.Status() + if status.IsClean() { + t.Errorf("Repo with untracked file should not be clean") + } + + if !status.IsUntracked("file") { + t.Errorf("New file should be untracked") + } +} + +func TestRepoWithStagedFile(t *testing.T) { + repo := newTestRepo(t) + createFile(t, repo, "file") + stageFile(t, repo, "file") + + wt, err := repo.Worktree() + checkFatal(t, err) + + status, err := wt.Status() + if status.IsClean() { + t.Errorf("Repo with staged file should not be clean") + } + + if status.IsUntracked("file") { + t.Errorf("Staged file should not be untracked") + } +} + +func TestRepoWithSingleCommit(t *testing.T) { + repo := newTestRepo(t) + createFile(t, repo, "file") + stageFile(t, repo, "file") + createCommit(t, repo, "Initial commit") + + wt, err := repo.Worktree() + checkFatal(t, err) + + status, err := wt.Status() + if !status.IsClean() { + t.Errorf("Repo with committed file should be clean") + } + + if status.IsUntracked("file") { + t.Errorf("Committed file should not be untracked") + } +} +func TestStatusWithModifiedFile(t *testing.T) { + //todo modified but not staged +} + +func TestStatusWithUntrackedButIgnoredFile(t *testing.T) { + //todo +} diff --git a/new/status.go b/new/status.go new file mode 100644 index 0000000..aca14f5 --- /dev/null +++ b/new/status.go @@ -0,0 +1,48 @@ +package new + +import ( + "github.com/go-git/go-git/v5" + "github.com/pkg/errors" +) + +type RepoStatus struct { + HasUntrackedFiles bool + HasUncommittedChanges bool + Branches map[string]BranchStatus +} + +type BranchStatus struct { + Name string + IsRemote bool + HasUpstream bool + NeedsPull bool + NeedsPush bool + Ahead int + Behind int +} + +func (r *Repo) LoadStatus() error { + wt, err := r.repo.Worktree() + if err != nil { + return errors.Wrap(err, "Failed getting worktree") + } + + status, err := wt.Status() + if err != nil { + return errors.Wrap(err, "Failed getting worktree status") + } + + r.Status.HasUncommittedChanges = !status.IsClean() + r.Status.HasUntrackedFiles = hasUntracked(status) + return nil +} + +// hasUntracked returns true if there's any untracked file in the worktree +func hasUntracked(status git.Status) bool { + for _, fs := range status { + if fs.Worktree == git.Untracked { + return true + } + } + return false +}