aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorlunnyxiao <xiaolunwen@gmail.com>2014-09-22 10:43:16 +0800
committerlunnyxiao <xiaolunwen@gmail.com>2014-09-22 10:43:16 +0800
commit150eef93b2340f665c070158ade1863339829e05 (patch)
tree6c44b11cfcd4d74cec98c25b734608296020cc75
parent7ba9257a7ff659417501baf7358216555cebcd86 (diff)
downloadgitea-150eef93b2340f665c070158ade1863339829e05.tar.gz
gitea-150eef93b2340f665c070158ade1863339829e05.zip
add submodule basic support & buf fixed #478
-rw-r--r--modules/git/commit.go50
-rw-r--r--modules/git/submodule.go6
-rw-r--r--modules/git/tree.go2
-rw-r--r--modules/git/tree_entry.go4
-rw-r--r--routers/repo/http.go5
-rw-r--r--routers/repo/view.go40
-rw-r--r--templates/repo/view_list.tmpl17
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>