add submodule basic support & buf fixed #478
This commit is contained in:
parent
7ba9257a7f
commit
150eef93b2
7 changed files with 115 additions and 9 deletions
|
@ -5,6 +5,7 @@
|
||||||
package git
|
package git
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bufio"
|
||||||
"container/list"
|
"container/list"
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
@ -17,7 +18,8 @@ type Commit struct {
|
||||||
Committer *Signature
|
Committer *Signature
|
||||||
CommitMessage string
|
CommitMessage string
|
||||||
|
|
||||||
parents []sha1 // sha1 strings
|
parents []sha1 // sha1 strings
|
||||||
|
submodules map[string]*SubModule
|
||||||
}
|
}
|
||||||
|
|
||||||
// Return the commit message. Same as retrieving CommitMessage directly.
|
// Return the commit message. Same as retrieving CommitMessage directly.
|
||||||
|
@ -84,3 +86,49 @@ func (c *Commit) CommitsByRange(page int) (*list.List, error) {
|
||||||
func (c *Commit) GetCommitOfRelPath(relPath string) (*Commit, error) {
|
func (c *Commit) GetCommitOfRelPath(relPath string) (*Commit, error) {
|
||||||
return c.repo.getCommitOfRelPath(c.Id, relPath)
|
return c.repo.getCommitOfRelPath(c.Id, relPath)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *Commit) GetSubModule(entryname string) (*SubModule, error) {
|
||||||
|
moduels, err := c.GetSubModules()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return moduels[entryname], nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *Commit) GetSubModules() (map[string]*SubModule, error) {
|
||||||
|
if c.submodules != nil {
|
||||||
|
return c.submodules, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
entry, err := c.GetTreeEntryByPath(".gitmodules")
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
rd, err := entry.Blob().Data()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
scanner := bufio.NewScanner(rd)
|
||||||
|
c.submodules = make(map[string]*SubModule)
|
||||||
|
var ismodule bool
|
||||||
|
var path string
|
||||||
|
for scanner.Scan() {
|
||||||
|
if strings.HasPrefix(scanner.Text(), "[submodule") {
|
||||||
|
ismodule = true
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if ismodule {
|
||||||
|
fields := strings.Split(scanner.Text(), "=")
|
||||||
|
k := strings.TrimSpace(fields[0])
|
||||||
|
if k == "path" {
|
||||||
|
path = strings.TrimSpace(fields[1])
|
||||||
|
} else if k == "url" {
|
||||||
|
c.submodules[path] = &SubModule{path, strings.TrimSpace(fields[1])}
|
||||||
|
ismodule = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return c.submodules, nil
|
||||||
|
}
|
||||||
|
|
6
modules/git/submodule.go
Normal file
6
modules/git/submodule.go
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
package git
|
||||||
|
|
||||||
|
type SubModule struct {
|
||||||
|
Name string
|
||||||
|
Url string
|
||||||
|
}
|
|
@ -51,6 +51,8 @@ func parseTreeData(tree *Tree, data []byte) ([]*TreeEntry, error) {
|
||||||
case "160000":
|
case "160000":
|
||||||
entry.mode = ModeCommit
|
entry.mode = ModeCommit
|
||||||
entry.Type = COMMIT
|
entry.Type = COMMIT
|
||||||
|
|
||||||
|
step = 8
|
||||||
case "040000":
|
case "040000":
|
||||||
entry.mode = ModeTree
|
entry.mode = ModeTree
|
||||||
entry.Type = TREE
|
entry.Type = TREE
|
||||||
|
|
|
@ -61,6 +61,10 @@ func (te *TreeEntry) Size() int64 {
|
||||||
return te.size
|
return te.size
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (te *TreeEntry) IsSubModule() bool {
|
||||||
|
return te.mode == ModeCommit
|
||||||
|
}
|
||||||
|
|
||||||
func (te *TreeEntry) IsDir() bool {
|
func (te *TreeEntry) IsDir() bool {
|
||||||
return te.mode == ModeTree
|
return te.mode == ModeTree
|
||||||
}
|
}
|
||||||
|
|
|
@ -103,6 +103,7 @@ func Http(ctx *middleware.Context) {
|
||||||
// check access
|
// check access
|
||||||
if askAuth {
|
if askAuth {
|
||||||
baHead := ctx.Req.Header.Get("Authorization")
|
baHead := ctx.Req.Header.Get("Authorization")
|
||||||
|
fmt.Println("auth:", baHead)
|
||||||
if baHead == "" {
|
if baHead == "" {
|
||||||
authRequired(ctx)
|
authRequired(ctx)
|
||||||
return
|
return
|
||||||
|
@ -121,6 +122,8 @@ func Http(ctx *middleware.Context) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fmt.Println("auth2:", authUsername, passwd)
|
||||||
|
|
||||||
authUser, err = models.GetUserByName(authUsername)
|
authUser, err = models.GetUserByName(authUsername)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ctx.Handle(401, "no basic auth and digit auth", nil)
|
ctx.Handle(401, "no basic auth and digit auth", nil)
|
||||||
|
@ -134,6 +137,8 @@ func Http(ctx *middleware.Context) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fmt.Println("passwd is right")
|
||||||
|
|
||||||
if !isPublicPull {
|
if !isPublicPull {
|
||||||
var tp = models.WRITABLE
|
var tp = models.WRITABLE
|
||||||
if isPull {
|
if isPull {
|
||||||
|
|
|
@ -10,6 +10,7 @@ import (
|
||||||
"path"
|
"path"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strings"
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/gogits/gogs/modules/base"
|
"github.com/gogits/gogs/modules/base"
|
||||||
"github.com/gogits/gogs/modules/git"
|
"github.com/gogits/gogs/modules/git"
|
||||||
|
@ -21,6 +22,15 @@ const (
|
||||||
HOME base.TplName = "repo/home"
|
HOME base.TplName = "repo/home"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type fakeCommit struct {
|
||||||
|
Id string
|
||||||
|
Summary string
|
||||||
|
Url string
|
||||||
|
Committer struct {
|
||||||
|
When time.Time
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func Home(ctx *middleware.Context) {
|
func Home(ctx *middleware.Context) {
|
||||||
ctx.Data["Title"] = ctx.Repo.Repository.Name
|
ctx.Data["Title"] = ctx.Repo.Repository.Name
|
||||||
|
|
||||||
|
@ -127,13 +137,31 @@ func Home(ctx *middleware.Context) {
|
||||||
files := make([][]interface{}, 0, len(entries))
|
files := make([][]interface{}, 0, len(entries))
|
||||||
|
|
||||||
for _, te := range entries {
|
for _, te := range entries {
|
||||||
c, err := ctx.Repo.Commit.GetCommitOfRelPath(filepath.Join(treePath, te.Name()))
|
if te.Type != git.COMMIT {
|
||||||
if err != nil {
|
c, err := ctx.Repo.Commit.GetCommitOfRelPath(filepath.Join(treePath, te.Name()))
|
||||||
ctx.Handle(404, "GetCommitOfRelPath", err)
|
if err != nil {
|
||||||
return
|
ctx.Handle(404, "GetCommitOfRelPath", err)
|
||||||
}
|
return
|
||||||
|
}
|
||||||
|
files = append(files, []interface{}{te, c})
|
||||||
|
} else {
|
||||||
|
sm, err := ctx.Repo.Commit.GetSubModule(path.Join(treename, te.Name()))
|
||||||
|
if err != nil {
|
||||||
|
ctx.Handle(404, "GetSubModule", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
files = append(files, []interface{}{te, c})
|
commit := git.Commit{
|
||||||
|
Tree: *tree,
|
||||||
|
Id: te.Id,
|
||||||
|
Committer: &git.Signature{
|
||||||
|
When: time.Now(),
|
||||||
|
},
|
||||||
|
CommitMessage: sm.Url,
|
||||||
|
}
|
||||||
|
|
||||||
|
files = append(files, []interface{}{te, &commit})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx.Data["Files"] = files
|
ctx.Data["Files"] = files
|
||||||
|
|
|
@ -27,8 +27,20 @@
|
||||||
{{$entry := index $item 0}}
|
{{$entry := index $item 0}}
|
||||||
{{$commit := index $item 1}}
|
{{$commit := index $item 1}}
|
||||||
<tr>
|
<tr>
|
||||||
<td class="icon">
|
{{if $entry.IsSubModule}}
|
||||||
<span class="octicon octicon-file-{{if $entry.IsDir}}directory{{else}}text{{end}}"></span>
|
<td class="icon">
|
||||||
|
<span class="octicon octicon-file-submodule"></span>
|
||||||
|
</td>
|
||||||
|
<td class="name">
|
||||||
|
<a href="{{$commit.CommitMessage}}" class="text-truncate">{{$entry.Name}}</a> @ <a href="{{$commit.CommitMessage}}/commit/{{$commit.Id}}">{{ShortSha $commit.Id.String}}</a>
|
||||||
|
</td>
|
||||||
|
<td class="msg">
|
||||||
|
<a class="text-truncate" href="{{$commit.CommitMessage}}/commit/{{$commit.Id}}" rel="nofollow">{{$commit.Summary}}</a>
|
||||||
|
</td>
|
||||||
|
<td class="age">{{TimeSince $commit.Committer.When $.i18n.Lang}}</td>
|
||||||
|
{{else}}
|
||||||
|
<td class="icon">
|
||||||
|
<span class="octicon octicon-file-{{if or $entry.IsDir}}directory{{else}}text{{end}}"></span>
|
||||||
</td>
|
</td>
|
||||||
<td class="name">
|
<td class="name">
|
||||||
<a href="{{$.BranchLink}}/{{$.TreePath}}{{$entry.Name}}" class="text-truncate">{{$entry.Name}}</a>
|
<a href="{{$.BranchLink}}/{{$.TreePath}}{{$entry.Name}}" class="text-truncate">{{$entry.Name}}</a>
|
||||||
|
@ -37,6 +49,7 @@
|
||||||
<a class="text-truncate" href="{{AppSubUrl}}/{{$.Username}}/{{$.Reponame}}/commit/{{$commit.Id}}" rel="nofollow">{{$commit.Summary}}</a>
|
<a class="text-truncate" href="{{AppSubUrl}}/{{$.Username}}/{{$.Reponame}}/commit/{{$commit.Id}}" rel="nofollow">{{$commit.Summary}}</a>
|
||||||
</td>
|
</td>
|
||||||
<td class="age">{{TimeSince $commit.Committer.When $.i18n.Lang}}</td>
|
<td class="age">{{TimeSince $commit.Committer.When $.i18n.Lang}}</td>
|
||||||
|
{{end}}
|
||||||
</tr>
|
</tr>
|
||||||
{{end}}
|
{{end}}
|
||||||
</tbody>
|
</tbody>
|
||||||
|
|
Loading…
Reference in a new issue