add submodule basic support & buf fixed #478
This commit is contained in:
		
							parent
							
								
									7ba9257a7f
								
							
						
					
					
						commit
						150eef93b2
					
				
					 7 changed files with 115 additions and 9 deletions
				
			
		|  | @ -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
									
								
								modules/git/submodule.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								modules/git/submodule.go
									
									
									
									
									
										Normal file
									
								
							|  | @ -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> | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue