@@ -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 | |||
} |
@@ -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": | |||
entry.mode = ModeCommit | |||
entry.Type = COMMIT | |||
step = 8 | |||
case "040000": | |||
entry.mode = ModeTree | |||
entry.Type = TREE | |||
@@ -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 | |||
} | |||
@@ -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 { | |||
@@ -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 | |||
@@ -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> | |||