]> source.dussan.org Git - gitea.git/commitdiff
add submodule basic support & buf fixed #478
authorlunnyxiao <xiaolunwen@gmail.com>
Mon, 22 Sep 2014 02:43:16 +0000 (10:43 +0800)
committerlunnyxiao <xiaolunwen@gmail.com>
Mon, 22 Sep 2014 02:43:16 +0000 (10:43 +0800)
modules/git/commit.go
modules/git/submodule.go [new file with mode: 0644]
modules/git/tree.go
modules/git/tree_entry.go
routers/repo/http.go
routers/repo/view.go
templates/repo/view_list.tmpl

index 52348fefedd5387e684034348138c198e2f3067f..d2d373da12e550978dcb3902b9aa0e6e70c22b11 100644 (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
+}
diff --git a/modules/git/submodule.go b/modules/git/submodule.go
new file mode 100644 (file)
index 0000000..28b5b9f
--- /dev/null
@@ -0,0 +1,6 @@
+package git
+
+type SubModule struct {
+       Name string
+       Url  string
+}
index 03152c34ac0a79c25a19be38e96feac96bdbd855..a3012443d73eb6843d57d753a86c2ce42bfc27ce 100644 (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
index e842f2332a956be937fc65fbfe309d200cf7901b..f65f332666e35f4ccfa45b3f49e2948223c1aea5 100644 (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
 }
index 56c85bf59a4c246c3bd9c8ee017500b3207f6cfd..a98478c9f5713d69a724d9909dde22bf2ba28c97 100644 (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 {
index e42894ae7351075f083049c21ba6f68be6270a37..41fdaba08c6ae66025f31de6fe0e3c256935c59b 100644 (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
index ce46cfb275ba969e39bb0615d9c79b3f9bcbe5af..e8628306c97f37dd8aaf66d01dd6b81c7f983da3 100644 (file)
             {{$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>