github.com/pdmccormick/importable-docker-buildx@v0.0.0-20240426161518-e47091289030/util/gitutil/gitutil_test.go (about) 1 package gitutil 2 3 import ( 4 "testing" 5 6 "github.com/stretchr/testify/require" 7 ) 8 9 func TestGit(t *testing.T) { 10 c, err := New() 11 require.NoError(t, err) 12 13 out, err := c.run("status") 14 require.NoError(t, err) 15 require.NotEmpty(t, out) 16 17 out, err = c.clean(c.run("not-exist")) 18 require.Error(t, err) 19 require.Empty(t, out) 20 require.Equal(t, "git: 'not-exist' is not a git command. See 'git --help'.", err.Error()) 21 } 22 23 func TestGitFullCommit(t *testing.T) { 24 Mktmp(t) 25 c, err := New() 26 require.NoError(t, err) 27 28 GitInit(c, t) 29 GitCommit(c, t, "bar") 30 31 out, err := c.FullCommit() 32 require.NoError(t, err) 33 require.Equal(t, 40, len(out)) 34 } 35 36 func TestGitShortCommit(t *testing.T) { 37 Mktmp(t) 38 c, err := New() 39 require.NoError(t, err) 40 41 GitInit(c, t) 42 GitCommit(c, t, "bar") 43 44 out, err := c.ShortCommit() 45 require.NoError(t, err) 46 require.Equal(t, 7, len(out)) 47 } 48 49 func TestGitFullCommitErr(t *testing.T) { 50 Mktmp(t) 51 c, err := New() 52 require.NoError(t, err) 53 54 GitInit(c, t) 55 56 _, err = c.FullCommit() 57 require.Error(t, err) 58 require.True(t, IsUnknownRevision(err)) 59 require.False(t, IsAmbiguousArgument(err)) 60 } 61 62 func TestGitShortCommitErr(t *testing.T) { 63 Mktmp(t) 64 c, err := New() 65 require.NoError(t, err) 66 67 GitInit(c, t) 68 69 _, err = c.ShortCommit() 70 require.Error(t, err) 71 require.True(t, IsUnknownRevision(err)) 72 require.False(t, IsAmbiguousArgument(err)) 73 } 74 75 func TestGitTagsPointsAt(t *testing.T) { 76 Mktmp(t) 77 c, err := New() 78 require.NoError(t, err) 79 80 GitInit(c, t) 81 GitCommit(c, t, "bar") 82 GitTag(c, t, "v0.8.0") 83 GitCommit(c, t, "foo") 84 GitTag(c, t, "v0.9.0") 85 86 out, err := c.clean(c.run("tag", "--points-at", "HEAD", "--sort", "-version:creatordate")) 87 require.NoError(t, err) 88 require.Equal(t, "v0.9.0", out) 89 } 90 91 func TestGitDescribeTags(t *testing.T) { 92 Mktmp(t) 93 c, err := New() 94 require.NoError(t, err) 95 96 GitInit(c, t) 97 GitCommit(c, t, "bar") 98 GitTag(c, t, "v0.8.0") 99 GitCommit(c, t, "foo") 100 GitTag(c, t, "v0.9.0") 101 102 out, err := c.clean(c.run("describe", "--tags", "--abbrev=0")) 103 require.NoError(t, err) 104 require.Equal(t, "v0.9.0", out) 105 } 106 107 func TestGitRemoteURL(t *testing.T) { 108 type remote struct { 109 name string 110 url string 111 tracking string 112 } 113 114 cases := []struct { 115 name string 116 remotes []remote 117 expected string 118 fail bool 119 }{ 120 { 121 name: "no remotes", 122 remotes: []remote{}, 123 fail: true, 124 }, 125 { 126 name: "origin", 127 remotes: []remote{ 128 { 129 name: "origin", 130 url: "git@github.com:crazy-max/buildx.git", 131 }, 132 }, 133 expected: "git@github.com:crazy-max/buildx.git", 134 }, 135 { 136 name: "upstream", 137 remotes: []remote{ 138 { 139 name: "upstream", 140 url: "git@github.com:docker/buildx.git", 141 }, 142 }, 143 expected: "git@github.com:docker/buildx.git", 144 }, 145 { 146 name: "origin and upstream", 147 remotes: []remote{ 148 { 149 name: "upstream", 150 url: "git@github.com:docker/buildx.git", 151 }, 152 { 153 name: "origin", 154 url: "git@github.com:crazy-max/buildx.git", 155 }, 156 }, 157 expected: "git@github.com:crazy-max/buildx.git", 158 }, 159 { 160 name: "not found", 161 remotes: []remote{ 162 { 163 name: "foo", 164 url: "git@github.com:docker/buildx.git", 165 }, 166 }, 167 fail: true, 168 }, 169 { 170 name: "single tracking branch", 171 remotes: []remote{ 172 { 173 name: "foo", 174 url: "https://github.com/tonistiigi/buildx.git", 175 tracking: "master", 176 }, 177 }, 178 expected: "https://github.com/tonistiigi/buildx.git", 179 }, 180 { 181 name: "fork tracking branch", 182 remotes: []remote{ 183 { 184 name: "origin", 185 url: "git@github.com:crazy-max/buildx.git", 186 }, 187 { 188 name: "foobranch", 189 url: "https://github.com/tonistiigi/buildx.git", 190 tracking: "master", 191 }, 192 { 193 name: "crazymax", 194 url: "git@github.com:crazy-max/buildx.git", 195 }, 196 }, 197 expected: "https://github.com/tonistiigi/buildx.git", 198 }, 199 } 200 for _, tt := range cases { 201 tt := tt 202 t.Run(tt.name, func(t *testing.T) { 203 Mktmp(t) 204 c, err := New() 205 require.NoError(t, err) 206 207 GitInit(c, t) 208 GitCommit(c, t, "initial commit") 209 for _, r := range tt.remotes { 210 GitSetRemote(c, t, r.name, r.url) 211 if r.tracking != "" { 212 GitSetMainUpstream(c, t, r.name, r.tracking) 213 } 214 } 215 216 ru, err := c.RemoteURL() 217 if tt.fail { 218 require.Error(t, err) 219 return 220 } 221 require.NoError(t, err) 222 require.Equal(t, tt.expected, ru) 223 }) 224 } 225 } 226 227 func TestStripCredentials(t *testing.T) { 228 cases := []struct { 229 name string 230 url string 231 want string 232 }{ 233 { 234 name: "non-blank Password", 235 url: "https://user:password@host.tld/this:that", 236 want: "https://host.tld/this:that", 237 }, 238 { 239 name: "blank Password", 240 url: "https://user@host.tld/this:that", 241 want: "https://host.tld/this:that", 242 }, 243 { 244 name: "blank Username", 245 url: "https://:password@host.tld/this:that", 246 want: "https://host.tld/this:that", 247 }, 248 { 249 name: "blank Username, blank Password", 250 url: "https://host.tld/this:that", 251 want: "https://host.tld/this:that", 252 }, 253 { 254 name: "invalid URL", 255 url: "1https://foo.com", 256 want: "1https://foo.com", 257 }, 258 } 259 for _, tt := range cases { 260 tt := tt 261 t.Run(tt.name, func(t *testing.T) { 262 if g, w := stripCredentials(tt.url), tt.want; g != w { 263 t.Fatalf("got: %q\nwant: %q", g, w) 264 } 265 }) 266 } 267 }