Browse Source

add submodule basic support & buf fixed #478

tags/v1.2.0-rc1
lunnyxiao 11 years ago
parent
commit
150eef93b2
7 changed files with 115 additions and 9 deletions
  1. +49
    -1
      modules/git/commit.go
  2. +6
    -0
      modules/git/submodule.go
  3. +2
    -0
      modules/git/tree.go
  4. +4
    -0
      modules/git/tree_entry.go
  5. +5
    -0
      routers/repo/http.go
  6. +34
    -6
      routers/repo/view.go
  7. +15
    -2
      templates/repo/view_list.tmpl

+ 49
- 1
modules/git/commit.go View File

@@ -5,6 +5,7 @@
package git

import (
"bufio"
"container/list"
"strings"
)
@@ -17,7 +18,8 @@ type Commit struct {
Committer *Signature
CommitMessage string

parents []sha1 // sha1 strings
parents []sha1 // sha1 strings
submodules map[string]*SubModule
}

// 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) {
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
- 0
modules/git/submodule.go View File

@@ -0,0 +1,6 @@
package git

type SubModule struct {
Name string
Url string
}

+ 2
- 0
modules/git/tree.go View File

@@ -51,6 +51,8 @@ func parseTreeData(tree *Tree, data []byte) ([]*TreeEntry, error) {
case "160000":
entry.mode = ModeCommit
entry.Type = COMMIT

step = 8
case "040000":
entry.mode = ModeTree
entry.Type = TREE


+ 4
- 0
modules/git/tree_entry.go View File

@@ -61,6 +61,10 @@ func (te *TreeEntry) Size() int64 {
return te.size
}

func (te *TreeEntry) IsSubModule() bool {
return te.mode == ModeCommit
}

func (te *TreeEntry) IsDir() bool {
return te.mode == ModeTree
}


+ 5
- 0
routers/repo/http.go View File

@@ -103,6 +103,7 @@ func Http(ctx *middleware.Context) {
// check access
if askAuth {
baHead := ctx.Req.Header.Get("Authorization")
fmt.Println("auth:", baHead)
if baHead == "" {
authRequired(ctx)
return
@@ -121,6 +122,8 @@ func Http(ctx *middleware.Context) {
return
}

fmt.Println("auth2:", authUsername, passwd)

authUser, err = models.GetUserByName(authUsername)
if err != nil {
ctx.Handle(401, "no basic auth and digit auth", nil)
@@ -134,6 +137,8 @@ func Http(ctx *middleware.Context) {
return
}

fmt.Println("passwd is right")

if !isPublicPull {
var tp = models.WRITABLE
if isPull {


+ 34
- 6
routers/repo/view.go View File

@@ -10,6 +10,7 @@ import (
"path"
"path/filepath"
"strings"
"time"

"github.com/gogits/gogs/modules/base"
"github.com/gogits/gogs/modules/git"
@@ -21,6 +22,15 @@ const (
HOME base.TplName = "repo/home"
)

type fakeCommit struct {
Id string
Summary string
Url string
Committer struct {
When time.Time
}
}

func Home(ctx *middleware.Context) {
ctx.Data["Title"] = ctx.Repo.Repository.Name

@@ -127,13 +137,31 @@ func Home(ctx *middleware.Context) {
files := make([][]interface{}, 0, len(entries))

for _, te := range entries {
c, err := ctx.Repo.Commit.GetCommitOfRelPath(filepath.Join(treePath, te.Name()))
if err != nil {
ctx.Handle(404, "GetCommitOfRelPath", err)
return
}
if te.Type != git.COMMIT {
c, err := ctx.Repo.Commit.GetCommitOfRelPath(filepath.Join(treePath, te.Name()))
if err != nil {
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


+ 15
- 2
templates/repo/view_list.tmpl View File

@@ -27,8 +27,20 @@
{{$entry := index $item 0}}
{{$commit := index $item 1}}
<tr>
<td class="icon">
<span class="octicon octicon-file-{{if $entry.IsDir}}directory{{else}}text{{end}}"></span>
{{if $entry.IsSubModule}}
<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 class="name">
<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>
</td>
<td class="age">{{TimeSince $commit.Committer.When $.i18n.Lang}}</td>
{{end}}
</tr>
{{end}}
</tbody>


Loading…
Cancel
Save