Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Improve LFS tests + fix lfs url refs + keep path upper/lowercase in db. #3092

Merged
merged 14 commits into from
Dec 8, 2017
153 changes: 139 additions & 14 deletions integrations/git_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,27 +6,32 @@ package integrations

import (
"context"
"fmt"
"io/ioutil"
"math/rand"
"net"
"net/http"
"net/url"
"os"
"path/filepath"
"testing"
"time"

"code.gitea.io/git"
"code.gitea.io/gitea/modules/setting"
api "code.gitea.io/sdk/gitea"

"github.com/Unknwon/com"
"github.com/stretchr/testify/assert"
)

func onGiteaWebRun(t *testing.T, callback func(*testing.T, string)) {
func onGiteaWebRun(t *testing.T, callback func(*testing.T, *url.URL)) {
s := http.Server{
Handler: mac,
}

listener, err := net.Listen("tcp", "")
u, err := url.Parse(setting.AppURL)
assert.NoError(t, err)
listener, err := net.Listen("tcp", u.Host)
assert.NoError(t, err)

defer func() {
Expand All @@ -37,24 +42,144 @@ func onGiteaWebRun(t *testing.T, callback func(*testing.T, string)) {

go s.Serve(listener)

_, port, err := net.SplitHostPort(listener.Addr().String())
assert.NoError(t, err)

callback(t, fmt.Sprintf("http://localhost:%s/", port))
callback(t, u)
}

func TestClone_ViaHTTP_NoLogin(t *testing.T) {
func TestGit(t *testing.T) {
prepareTestEnv(t)

onGiteaWebRun(t, func(t *testing.T, urlPrefix string) {
dstPath, err := ioutil.TempDir("", "repo1")
onGiteaWebRun(t, func(t *testing.T, u *url.URL) {
dstPath, err := ioutil.TempDir("", "repo-tmp-17")
assert.NoError(t, err)
defer os.RemoveAll(dstPath)
u.Path = "user2/repo1.git"

err = git.Clone(fmt.Sprintf("%suser2/repo1.git", urlPrefix),
dstPath, git.CloneRepoOptions{})
assert.NoError(t, err)
t.Run("Standard", func(t *testing.T) {

t.Run("CloneNoLogin", func(t *testing.T) {
dstLocalPath, err := ioutil.TempDir("", "repo1")
assert.NoError(t, err)
defer os.RemoveAll(dstLocalPath)
err = git.Clone(u.String(), dstLocalPath, git.CloneRepoOptions{})
assert.NoError(t, err)
assert.True(t, com.IsExist(filepath.Join(dstLocalPath, "README.md")))
})

t.Run("CreateRepo", func(t *testing.T) {
session := loginUser(t, "user2")
req := NewRequestWithJSON(t, "POST", "/api/v1/user/repos", &api.CreateRepoOption{
AutoInit: true,
Description: "Temporary repo",
Name: "repo-tmp-17",
Private: false,
Gitignores: "",
License: "WTFPL",
Readme: "Default",
})
session.MakeRequest(t, req, http.StatusCreated)
})

u.Path = "user2/repo-tmp-17.git"
u.User = url.UserPassword("user2", "password")
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: use the userPassword constant (also in 162).

t.Run("Clone", func(t *testing.T) {
err = git.Clone(u.String(), dstPath, git.CloneRepoOptions{})
assert.NoError(t, err)
assert.True(t, com.IsExist(filepath.Join(dstPath, "README.md")))
})

t.Run("PushCommit", func(t *testing.T) {
data := make([]byte, 1024)
_, err := rand.Read(data)
assert.NoError(t, err)
tmpFile, err := ioutil.TempFile(dstPath, "data-file-")
defer tmpFile.Close()
_, err = tmpFile.Write(data)
assert.NoError(t, err)

//Commit
err = git.AddChanges(dstPath, false, filepath.Base(tmpFile.Name()))
assert.NoError(t, err)
err = git.CommitChanges(dstPath, git.CommitChangesOptions{
Committer: &git.Signature{
Email: "[email protected]",
Name: "User Two",
When: time.Now(),
},
Author: &git.Signature{
Email: "[email protected]",
Name: "User Two",
When: time.Now(),
},
Message: "Testing commit",
})
assert.NoError(t, err)

//Push
err = git.Push(dstPath, git.PushOptions{
Branch: "master",
Remote: u.String(),
Force: false,
})
assert.NoError(t, err)
})
})
t.Run("LFS", func(t *testing.T) {
t.Run("PushCommit", func(t *testing.T) {
/* Generate random file */
data := make([]byte, 1024)
_, err := rand.Read(data)
assert.NoError(t, err)
tmpFile, err := ioutil.TempFile(dstPath, "data-file-")
defer tmpFile.Close()
_, err = tmpFile.Write(data)
assert.NoError(t, err)

//Setup git LFS
_, err = git.NewCommand("lfs").AddArguments("install").RunInDir(dstPath)
assert.NoError(t, err)
_, err = git.NewCommand("lfs").AddArguments("track", "data-file-*").RunInDir(dstPath)
assert.NoError(t, err)

//Commit
err = git.AddChanges(dstPath, false, ".gitattributes", filepath.Base(tmpFile.Name()))
assert.NoError(t, err)
err = git.CommitChanges(dstPath, git.CommitChangesOptions{
Committer: &git.Signature{
Email: "[email protected]",
Name: "User Two",
When: time.Now(),
},
Author: &git.Signature{
Email: "[email protected]",
Name: "User Two",
When: time.Now(),
},
Message: "Testing LFS ",
})
assert.NoError(t, err)

//Push
u.User = url.UserPassword("user2", "password")
err = git.Push(dstPath, git.PushOptions{
Branch: "master",
Remote: u.String(),
Force: false,
})
assert.NoError(t, err)
})
t.Run("Locks", func(t *testing.T) {
_, err = git.NewCommand("remote").AddArguments("set-url", "origin", u.String()).RunInDir(dstPath) //TODO add test ssh git-lfs-creds
assert.NoError(t, err)
_, err = git.NewCommand("lfs").AddArguments("locks").RunInDir(dstPath)
assert.NoError(t, err)
_, err = git.NewCommand("lfs").AddArguments("lock", "README.md").RunInDir(dstPath)
assert.NoError(t, err)
_, err = git.NewCommand("lfs").AddArguments("locks").RunInDir(dstPath)
assert.NoError(t, err)
_, err = git.NewCommand("lfs").AddArguments("unlock", "README.md").RunInDir(dstPath)
assert.NoError(t, err)
})

assert.True(t, com.IsExist(filepath.Join(dstPath, "README.md")))
})
})
}
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
#!/usr/bin/env bash
"$GITEA_ROOT/gitea" hook --config='integrations/app.ini' post-receive
"$GITEA_ROOT/gitea" hook --config="$GITEA_ROOT/$GITEA_CONF" post-receive
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
#!/usr/bin/env bash
"$GITEA_ROOT/gitea" hook --config='integrations/app.ini' pre-receive
"$GITEA_ROOT/gitea" hook --config="$GITEA_ROOT/$GITEA_CONF" pre-receive
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
#!/usr/bin/env bash
"$GITEA_ROOT/gitea" hook --config='integrations/app.ini' update $1 $2 $3
"$GITEA_ROOT/gitea" hook --config="$GITEA_ROOT/$GITEA_CONF" update $1 $2 $3
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
#!/usr/bin/env bash
"$GITEA_ROOT/gitea" hook --config='integrations/app.ini' post-receive
"$GITEA_ROOT/gitea" hook --config="$GITEA_ROOT/$GITEA_CONF" post-receive
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
#!/usr/bin/env bash
"$GITEA_ROOT/gitea" hook --config='integrations/app.ini' pre-receive
"$GITEA_ROOT/gitea" hook --config="$GITEA_ROOT/$GITEA_CONF" pre-receive
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
#!/usr/bin/env bash
"$GITEA_ROOT/gitea" hook --config='integrations/app.ini' update $1 $2 $3
"$GITEA_ROOT/gitea" hook --config="$GITEA_ROOT/$GITEA_CONF" update $1 $2 $3
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
#!/usr/bin/env bash
"$GITEA_ROOT/gitea" hook --config='integrations/app.ini' post-receive
"$GITEA_ROOT/gitea" hook --config="$GITEA_ROOT/$GITEA_CONF" post-receive
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
#!/usr/bin/env bash
"$GITEA_ROOT/gitea" hook --config='integrations/app.ini' pre-receive
"$GITEA_ROOT/gitea" hook --config="$GITEA_ROOT/$GITEA_CONF" pre-receive
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
#!/usr/bin/env bash
"$GITEA_ROOT/gitea" hook --config='integrations/app.ini' update $1 $2 $3
"$GITEA_ROOT/gitea" hook --config="$GITEA_ROOT/$GITEA_CONF" update $1 $2 $3
6 changes: 3 additions & 3 deletions models/lfs_lock.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ func (l *LFSLock) AfterLoad() {
}

func cleanPath(p string) string {
return strings.ToLower(path.Clean(p))
return path.Clean(p)
}

// APIFormat convert a Release to lfs.LFSLock
Expand Down Expand Up @@ -73,8 +73,8 @@ func CreateLFSLock(lock *LFSLock) (*LFSLock, error) {
// GetLFSLock returns release by given path.
func GetLFSLock(repoID int64, path string) (*LFSLock, error) {
path = cleanPath(path)
rel := &LFSLock{RepoID: repoID, Path: path}
has, err := x.Get(rel)
rel := &LFSLock{RepoID: repoID}
has, err := x.Where("lower(path) = ?", strings.ToLower(path)).Get(rel)
if err != nil {
return nil, err
}
Expand Down
4 changes: 2 additions & 2 deletions modules/lfs/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -68,12 +68,12 @@ type ObjectError struct {

// ObjectLink builds a URL linking to the object.
func (v *RequestVars) ObjectLink() string {
return setting.AppURL + path.Join(v.User, v.Repo, "info/lfs/objects", v.Oid)
return setting.AppURL + path.Join(v.User, v.Repo+".git", "info/lfs/objects", v.Oid)
}

// VerifyLink builds a URL for verifying the object.
func (v *RequestVars) VerifyLink() string {
return setting.AppURL + path.Join(v.User, v.Repo, "info/lfs/verify")
return setting.AppURL + path.Join(v.User, v.Repo+".git", "info/lfs/verify")
}

// link provides a structure used to build a hypermedia representation of an HTTP link.
Expand Down
2 changes: 1 addition & 1 deletion routers/repo/view.go
Original file line number Diff line number Diff line change
Expand Up @@ -179,7 +179,7 @@ func renderFile(ctx *context.Context, entry *git.TreeEntry, treeLink, rawLink st
ctx.Data["IsLFSFile"] = true
ctx.Data["FileSize"] = size
filenameBase64 := base64.RawURLEncoding.EncodeToString([]byte(blob.Name()))
ctx.Data["RawFileLink"] = fmt.Sprintf("%s%s/info/lfs/objects/%s/%s", setting.AppURL, ctx.Repo.Repository.FullName(), oid, filenameBase64)
ctx.Data["RawFileLink"] = fmt.Sprintf("%s%s.git/info/lfs/objects/%s/%s", setting.AppURL, ctx.Repo.Repository.FullName(), oid, filenameBase64)
}
}
}
Expand Down