diff options
author | lunnyxiao <xiaolunwen@gmail.com> | 2014-09-22 10:43:16 +0800 |
---|---|---|
committer | lunnyxiao <xiaolunwen@gmail.com> | 2014-09-22 10:43:16 +0800 |
commit | 150eef93b2340f665c070158ade1863339829e05 (patch) | |
tree | 6c44b11cfcd4d74cec98c25b734608296020cc75 | |
parent | 7ba9257a7ff659417501baf7358216555cebcd86 (diff) | |
download | gitea-150eef93b2340f665c070158ade1863339829e05.tar.gz gitea-150eef93b2340f665c070158ade1863339829e05.zip |
add submodule basic support & buf fixed #478
-rw-r--r-- | modules/git/commit.go | 50 | ||||
-rw-r--r-- | modules/git/submodule.go | 6 | ||||
-rw-r--r-- | modules/git/tree.go | 2 | ||||
-rw-r--r-- | modules/git/tree_entry.go | 4 | ||||
-rw-r--r-- | routers/repo/http.go | 5 | ||||
-rw-r--r-- | routers/repo/view.go | 40 | ||||
-rw-r--r-- | templates/repo/view_list.tmpl | 17 |
7 files changed, 115 insertions, 9 deletions
diff --git a/modules/git/commit.go b/modules/git/commit.go index 52348fefed..d2d373da12 100644 --- a/modules/git/commit.go +++ b/modules/git/commit.go @@ -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 +} diff --git a/modules/git/submodule.go b/modules/git/submodule.go new file mode 100644 index 0000000000..28b5b9f375 --- /dev/null +++ b/modules/git/submodule.go @@ -0,0 +1,6 @@ +package git + +type SubModule struct { + Name string + Url string +} diff --git a/modules/git/tree.go b/modules/git/tree.go index 03152c34ac..a3012443d7 100644 --- a/modules/git/tree.go +++ b/modules/git/tree.go @@ -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 diff --git a/modules/git/tree_entry.go b/modules/git/tree_entry.go index e842f2332a..f65f332666 100644 --- a/modules/git/tree_entry.go +++ b/modules/git/tree_entry.go @@ -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 } diff --git a/routers/repo/http.go b/routers/repo/http.go index 56c85bf59a..a98478c9f5 100644 --- a/routers/repo/http.go +++ b/routers/repo/http.go @@ -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 { diff --git a/routers/repo/view.go b/routers/repo/view.go index e42894ae73..41fdaba08c 100644 --- a/routers/repo/view.go +++ b/routers/repo/view.go @@ -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 diff --git a/templates/repo/view_list.tmpl b/templates/repo/view_list.tmpl index ce46cfb275..e8628306c9 100644 --- a/templates/repo/view_list.tmpl +++ b/templates/repo/view_list.tmpl @@ -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> |