Merge branch 'dev' of github.com:gogits/gogs into dev
This commit is contained in:
		
						commit
						a85f242030
					
				| @ -19,6 +19,7 @@ github.com/lib/pq = | |||||||
| github.com/nfnt/resize =  | github.com/nfnt/resize =  | ||||||
| github.com/qiniu/log =  | github.com/qiniu/log =  | ||||||
| github.com/robfig/cron =  | github.com/robfig/cron =  | ||||||
|  | github.com/juju2013/goldap =  | ||||||
| 
 | 
 | ||||||
| [res] | [res] | ||||||
| include = templates|public|conf | include = templates|public|conf | ||||||
|  | |||||||
| @ -10,6 +10,8 @@ Want to hack on Gogs? Awesome! Here are instructions to get you started. They ar | |||||||
| 
 | 
 | ||||||
| ### Pull requests are always welcome | ### Pull requests are always welcome | ||||||
| 
 | 
 | ||||||
|  | **ALL PULL REQUESTS MUST SEND TO `DEV` BRANCH** | ||||||
|  | 
 | ||||||
| We are always thrilled to receive pull requests, and do our best to process them as fast as possible. Not sure if that typo is worth a pull request? Do it! We will appreciate it. | We are always thrilled to receive pull requests, and do our best to process them as fast as possible. Not sure if that typo is worth a pull request? Do it! We will appreciate it. | ||||||
| 
 | 
 | ||||||
| If your pull request is not accepted on the first try, don't be discouraged! If there's a problem with the implementation, hopefully you received feedback on what to improve. | If your pull request is not accepted on the first try, don't be discouraged! If there's a problem with the implementation, hopefully you received feedback on what to improve. | ||||||
|  | |||||||
| @ -5,7 +5,7 @@ Gogs(Go Git Service) is a Self Hosted Git Service in the Go Programming Language | |||||||
| 
 | 
 | ||||||
|  |  | ||||||
| 
 | 
 | ||||||
| ##### Current version: 0.3.0 Alpha | ##### Current version: 0.3.1 Alpha | ||||||
| 
 | 
 | ||||||
| ### NOTICES | ### NOTICES | ||||||
| 
 | 
 | ||||||
| @ -42,6 +42,11 @@ More importantly, Gogs only needs one binary to setup your own project hosting o | |||||||
| - Supports MySQL, PostgreSQL and SQLite3. | - Supports MySQL, PostgreSQL and SQLite3. | ||||||
| - Social account login(GitHub, Google, QQ, Weibo) | - Social account login(GitHub, Google, QQ, Weibo) | ||||||
| 
 | 
 | ||||||
|  | ## System Requirements | ||||||
|  | 
 | ||||||
|  | - A cheap Raspberry Pi is powerful enough to match the minimal requirement. | ||||||
|  | - 4 CPU Cores and 1GB RAM would be the baseline for teamwork. | ||||||
|  | 
 | ||||||
| ## Installation | ## Installation | ||||||
| 
 | 
 | ||||||
| Make sure you install [Prerequirements](https://github.com/gogits/gogs/wiki/Prerequirements) first. | Make sure you install [Prerequirements](https://github.com/gogits/gogs/wiki/Prerequirements) first. | ||||||
|  | |||||||
| @ -5,7 +5,7 @@ Gogs(Go Git Service) 是一个由 Go 语言编写的自助 Git 托管服务。 | |||||||
| 
 | 
 | ||||||
|  |  | ||||||
| 
 | 
 | ||||||
| ##### 当前版本:0.3.0 Alpha | ##### 当前版本:0.3.1 Alpha | ||||||
| 
 | 
 | ||||||
| ## 开发目的 | ## 开发目的 | ||||||
| 
 | 
 | ||||||
| @ -33,6 +33,12 @@ Gogs 完全使用 Go 语言来实现对 Git 数据的操作,实现 **零** 依 | |||||||
| - 支持 MySQL、PostgreSQL 以及 SQLite3 数据库 | - 支持 MySQL、PostgreSQL 以及 SQLite3 数据库 | ||||||
| - 社交帐号登录(GitHub、Google、QQ、微博) | - 社交帐号登录(GitHub、Google、QQ、微博) | ||||||
| 
 | 
 | ||||||
|  | ## 系统要求 | ||||||
|  | 
 | ||||||
|  | - 最低的系统硬件要求为一个廉价的树莓派 | ||||||
|  | - 如果用于团队项目,建议使用 4 核 CPU 及 1GB 内存 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| ## 安装部署 | ## 安装部署 | ||||||
| 
 | 
 | ||||||
| 在安装 Gogs 之前,您需要先安装 [基本环境](https://github.com/gogits/gogs/wiki/Prerequirements)。 | 在安装 Gogs 之前,您需要先安装 [基本环境](https://github.com/gogits/gogs/wiki/Prerequirements)。 | ||||||
|  | |||||||
| @ -16,6 +16,8 @@ LICENSES = Apache v2 License|GPL v2|MIT License|Affero GPL|Artistic License 2.0| | |||||||
| PROTOCOL = http | PROTOCOL = http | ||||||
| DOMAIN = localhost | DOMAIN = localhost | ||||||
| ROOT_URL = %(PROTOCOL)s://%(DOMAIN)s:%(HTTP_PORT)s/ | ROOT_URL = %(PROTOCOL)s://%(DOMAIN)s:%(HTTP_PORT)s/ | ||||||
|  | ; Disable CDN even in "prod" mode | ||||||
|  | OFFLINE_MODE = false | ||||||
| HTTP_ADDR =  | HTTP_ADDR =  | ||||||
| HTTP_PORT = 3000 | HTTP_PORT = 3000 | ||||||
| ; Generate steps: | ; Generate steps: | ||||||
|  | |||||||
| @ -18,8 +18,8 @@ | |||||||
| ### install the gogs | ### install the gogs | ||||||
| - mkdir gogs | - mkdir gogs | ||||||
| - cd gogs | - cd gogs | ||||||
| - curl -L http://gobuild.io/github.com/gogits/gogs/v0.2.0/linux/amd64 -o v0.2.0.zip | - curl -L http://gobuild.io/github.com/gogits/gogs/v0.3.0/linux/amd64 -o v0.3.0.zip | ||||||
| - unzip v0.2.0.zip | - unzip v0.3.0.zip | ||||||
| - ./start.sh | - ./start.sh | ||||||
| 
 | 
 | ||||||
| > The up-to-date binary could be found at | > The up-to-date binary could be found at | ||||||
|  | |||||||
| @ -13,7 +13,7 @@ ENV GOROOT /usr/local/go | |||||||
| ENV GOPATH /go | ENV GOPATH /go | ||||||
| 
 | 
 | ||||||
| RUN apt-get update && apt-get install --yes --force-yes curl git mercurial zip wget ca-certificates build-essential | RUN apt-get update && apt-get install --yes --force-yes curl git mercurial zip wget ca-certificates build-essential | ||||||
| RUN apt-get install -yq vim | RUN apt-get install -yq vim sudo | ||||||
| 
 | 
 | ||||||
| RUN curl -s http://docker.u.qiniudn.com/go1.2.1.src.tar.gz | tar -v -C /usr/local -xz | RUN curl -s http://docker.u.qiniudn.com/go1.2.1.src.tar.gz | tar -v -C /usr/local -xz | ||||||
| RUN cd /usr/local/go/src && ./make.bash --no-clean 2>&1 | RUN cd /usr/local/go/src && ./make.bash --no-clean 2>&1 | ||||||
|  | |||||||
| @ -9,7 +9,8 @@ RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys B97B0AFCAA | |||||||
| 
 | 
 | ||||||
| # Add PostgreSQL's repository. It contains the most recent stable release | # Add PostgreSQL's repository. It contains the most recent stable release | ||||||
| #     of PostgreSQL, ``9.3``. | #     of PostgreSQL, ``9.3``. | ||||||
| RUN echo "deb http://apt.postgresql.org/pub/repos/apt/ precise-pgdg main" > /etc/apt/sources.list.d/pgdg.list | # See http://apt.postgresql.org/pub/repos/apt/README | ||||||
|  | RUN echo "deb http://apt.postgresql.org/pub/repos/apt/ $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list | ||||||
| 
 | 
 | ||||||
| # Update the Ubuntu and PostgreSQL repository indexes | # Update the Ubuntu and PostgreSQL repository indexes | ||||||
| RUN apt-get update | RUN apt-get update | ||||||
|  | |||||||
							
								
								
									
										2
									
								
								gogs.go
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								gogs.go
									
									
									
									
									
								
							| @ -19,7 +19,7 @@ import ( | |||||||
| // Test that go1.2 tag above is included in builds. main.go refers to this definition.
 | // Test that go1.2 tag above is included in builds. main.go refers to this definition.
 | ||||||
| const go12tag = true | const go12tag = true | ||||||
| 
 | 
 | ||||||
| const APP_VER = "0.3.0.0422 Alpha" | const APP_VER = "0.3.1.0427 Alpha" | ||||||
| 
 | 
 | ||||||
| func init() { | func init() { | ||||||
| 	base.AppVer = APP_VER | 	base.AppVer = APP_VER | ||||||
|  | |||||||
| @ -77,12 +77,12 @@ func init() { | |||||||
| // PublicKey represents a SSH key of user.
 | // PublicKey represents a SSH key of user.
 | ||||||
| type PublicKey struct { | type PublicKey struct { | ||||||
| 	Id          int64 | 	Id          int64 | ||||||
| 	OwnerId     int64  `xorm:"unique(s) index not null"` | 	OwnerId     int64  `xorm:"UNIQUE(s) INDEX NOT NULL"` | ||||||
| 	Name        string `xorm:"unique(s) not null"` | 	Name        string `xorm:"UNIQUE(s) NOT NULL"` | ||||||
| 	Fingerprint string | 	Fingerprint string | ||||||
| 	Content     string    `xorm:"TEXT not null"` | 	Content     string    `xorm:"TEXT NOT NULL"` | ||||||
| 	Created     time.Time `xorm:"created"` | 	Created     time.Time `xorm:"CREATED"` | ||||||
| 	Updated     time.Time `xorm:"updated"` | 	Updated     time.Time `xorm:"UPDATED"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // GenAuthorizedKey returns formatted public key string.
 | // GenAuthorizedKey returns formatted public key string.
 | ||||||
| @ -107,9 +107,9 @@ func AddPublicKey(key *PublicKey) (err error) { | |||||||
| 	if err = ioutil.WriteFile(tmpPath, []byte(key.Content), os.ModePerm); err != nil { | 	if err = ioutil.WriteFile(tmpPath, []byte(key.Content), os.ModePerm); err != nil { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
| 	stdout, _, err := com.ExecCmd("ssh-keygen", "-l", "-f", tmpPath) | 	stdout, stderr, err := com.ExecCmd("ssh-keygen", "-l", "-f", tmpPath) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return err | 		return errors.New("ssh-keygen -l -f: " + stderr) | ||||||
| 	} else if len(stdout) < 2 { | 	} else if len(stdout) < 2 { | ||||||
| 		return errors.New("Not enough output for calculating fingerprint") | 		return errors.New("Not enough output for calculating fingerprint") | ||||||
| 	} | 	} | ||||||
|  | |||||||
| @ -159,9 +159,7 @@ func MirrorUpdate() { | |||||||
| 		repoPath := filepath.Join(base.RepoRootPath, m.RepoName+".git") | 		repoPath := filepath.Join(base.RepoRootPath, m.RepoName+".git") | ||||||
| 		_, stderr, err := com.ExecCmdDir(repoPath, "git", "remote", "update") | 		_, stderr, err := com.ExecCmdDir(repoPath, "git", "remote", "update") | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return err | 			return errors.New("git remote update: " + stderr) | ||||||
| 		} else if strings.Contains(stderr, "fatal:") { |  | ||||||
| 			return errors.New(stderr) |  | ||||||
| 		} else if err = git.UnpackRefs(repoPath); err != nil { | 		} else if err = git.UnpackRefs(repoPath); err != nil { | ||||||
| 			return err | 			return err | ||||||
| 		} | 		} | ||||||
| @ -177,9 +175,7 @@ func MirrorUpdate() { | |||||||
| func MirrorRepository(repoId int64, userName, repoName, repoPath, url string) error { | func MirrorRepository(repoId int64, userName, repoName, repoPath, url string) error { | ||||||
| 	_, stderr, err := com.ExecCmd("git", "clone", "--mirror", url, repoPath) | 	_, stderr, err := com.ExecCmd("git", "clone", "--mirror", url, repoPath) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return err | 		return errors.New("git clone --mirror: " + stderr) | ||||||
| 	} else if strings.Contains(stderr, "fatal:") { |  | ||||||
| 		return errors.New(stderr) |  | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if _, err = orm.InsertOne(&Mirror{ | 	if _, err = orm.InsertOne(&Mirror{ | ||||||
| @ -219,23 +215,17 @@ func MigrateRepository(user *User, name, desc string, private, mirror bool, url | |||||||
| 	// Clone from local repository.
 | 	// Clone from local repository.
 | ||||||
| 	_, stderr, err := com.ExecCmd("git", "clone", repoPath, tmpDir) | 	_, stderr, err := com.ExecCmd("git", "clone", repoPath, tmpDir) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return repo, err |  | ||||||
| 	} else if strings.Contains(stderr, "fatal:") { |  | ||||||
| 		return repo, errors.New("git clone: " + stderr) | 		return repo, errors.New("git clone: " + stderr) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	// Pull data from source.
 | 	// Pull data from source.
 | ||||||
| 	_, stderr, err = com.ExecCmdDir(tmpDir, "git", "pull", url) | 	_, stderr, err = com.ExecCmdDir(tmpDir, "git", "pull", url) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return repo, err |  | ||||||
| 	} else if strings.Contains(stderr, "fatal:") { |  | ||||||
| 		return repo, errors.New("git pull: " + stderr) | 		return repo, errors.New("git pull: " + stderr) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	// Push data to local repository.
 | 	// Push data to local repository.
 | ||||||
| 	if _, stderr, err = com.ExecCmdDir(tmpDir, "git", "push", "origin", "master"); err != nil { | 	if _, stderr, err = com.ExecCmdDir(tmpDir, "git", "push", "origin", "master"); err != nil { | ||||||
| 		return repo, err |  | ||||||
| 	} else if strings.Contains(stderr, "fatal:") { |  | ||||||
| 		return repo, errors.New("git push: " + stderr) | 		return repo, errors.New("git push: " + stderr) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| @ -403,10 +393,11 @@ func initRepository(f string, user *User, repo *Repository, initReadme bool, rep | |||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	rp := strings.NewReplacer("\\", "/", " ", "\\ ") | ||||||
| 	// hook/post-update
 | 	// hook/post-update
 | ||||||
| 	if err := createHookUpdate(filepath.Join(repoPath, "hooks", "update"), | 	if err := createHookUpdate(filepath.Join(repoPath, "hooks", "update"), | ||||||
| 		fmt.Sprintf("#!/usr/bin/env %s\n%s update $1 $2 $3\n", base.ScriptType, | 		fmt.Sprintf("#!/usr/bin/env %s\n%s update $1 $2 $3\n", base.ScriptType, | ||||||
| 			strings.Replace(appPath, "\\", "/", -1))); err != nil { | 			rp.Replace(appPath))); err != nil { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| @ -428,8 +419,6 @@ func initRepository(f string, user *User, repo *Repository, initReadme bool, rep | |||||||
| 
 | 
 | ||||||
| 	_, stderr, err := com.ExecCmd("git", "clone", repoPath, tmpDir) | 	_, stderr, err := com.ExecCmd("git", "clone", repoPath, tmpDir) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return err |  | ||||||
| 	} else if strings.Contains(stderr, "fatal:") { |  | ||||||
| 		return errors.New("git clone: " + stderr) | 		return errors.New("git clone: " + stderr) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -1,3 +1,7 @@ | |||||||
|  | // Copyright 2014 The Gogs Authors. All rights reserved.
 | ||||||
|  | // Use of this source code is governed by a MIT-style
 | ||||||
|  | // license that can be found in the LICENSE file.
 | ||||||
|  | 
 | ||||||
| package models | package models | ||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
| @ -5,9 +9,11 @@ import ( | |||||||
| 	"os/exec" | 	"os/exec" | ||||||
| 	"strings" | 	"strings" | ||||||
| 
 | 
 | ||||||
| 	"github.com/gogits/git" |  | ||||||
| 	"github.com/gogits/gogs/modules/base" |  | ||||||
| 	qlog "github.com/qiniu/log" | 	qlog "github.com/qiniu/log" | ||||||
|  | 
 | ||||||
|  | 	"github.com/gogits/git" | ||||||
|  | 
 | ||||||
|  | 	"github.com/gogits/gogs/modules/base" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| func Update(refName, oldCommitId, newCommitId, userName, repoName string, userId int64) { | func Update(refName, oldCommitId, newCommitId, userName, repoName string, userId int64) { | ||||||
|  | |||||||
| @ -410,21 +410,27 @@ func GetUserByEmail(email string) (*User, error) { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // LoginUserPlain validates user by raw user name and password.
 | // LoginUserPlain validates user by raw user name and password.
 | ||||||
| func LoginUserPlain(name, passwd string) (*User, error) { | func LoginUserPlain(uname, passwd string) (*User, error) { | ||||||
| 	user := User{LowerName: strings.ToLower(name)} | 	var u *User | ||||||
| 	has, err := orm.Get(&user) | 	if strings.Contains(uname, "@") { | ||||||
|  | 		u = &User{Email: uname} | ||||||
|  | 	} else { | ||||||
|  | 		u = &User{LowerName: strings.ToLower(uname)} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	has, err := orm.Get(u) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} else if !has { | 	} else if !has { | ||||||
| 		return nil, ErrUserNotExist | 		return nil, ErrUserNotExist | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	newUser := &User{Passwd: passwd, Salt: user.Salt} | 	newUser := &User{Passwd: passwd, Salt: u.Salt} | ||||||
| 	newUser.EncodePasswd() | 	newUser.EncodePasswd() | ||||||
| 	if user.Passwd != newUser.Passwd { | 	if u.Passwd != newUser.Passwd { | ||||||
| 		return nil, ErrUserNotExist | 		return nil, ErrUserNotExist | ||||||
| 	} | 	} | ||||||
| 	return &user, nil | 	return u, nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // Follow is connection request for receiving user notifycation.
 | // Follow is connection request for receiving user notifycation.
 | ||||||
|  | |||||||
| @ -57,7 +57,7 @@ func (f *RegisterForm) Validate(errors *base.BindingErrors, req *http.Request, c | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| type LogInForm struct { | type LogInForm struct { | ||||||
| 	UserName string `form:"username" binding:"Required;AlphaDash;MaxSize(30)"` | 	UserName string `form:"username" binding:"Required;MaxSize(35)"` | ||||||
| 	Password string `form:"passwd" binding:"Required;MinSize(6);MaxSize(30)"` | 	Password string `form:"passwd" binding:"Required;MinSize(6);MaxSize(30)"` | ||||||
| 	Remember string `form:"remember"` | 	Remember string `form:"remember"` | ||||||
| } | } | ||||||
|  | |||||||
| @ -45,15 +45,15 @@ type Oauther struct { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| var ( | var ( | ||||||
| 	AppVer     string | 	AppVer      string | ||||||
| 	AppName    string | 	AppName     string | ||||||
| 	AppLogo    string | 	AppLogo     string | ||||||
| 	AppUrl     string | 	AppUrl      string | ||||||
| 	IsProdMode bool | 	OfflineMode bool | ||||||
| 	Domain     string | 	ProdMode    bool | ||||||
| 	SecretKey  string | 	Domain      string | ||||||
| 	RunUser    string | 	SecretKey   string | ||||||
| 	LdapAuth   bool | 	RunUser     string | ||||||
| 
 | 
 | ||||||
| 	RepoRootPath string | 	RepoRootPath string | ||||||
| 	ScriptType   string | 	ScriptType   string | ||||||
| @ -93,6 +93,7 @@ var Service struct { | |||||||
| 	NotifyMail           bool | 	NotifyMail           bool | ||||||
| 	ActiveCodeLives      int | 	ActiveCodeLives      int | ||||||
| 	ResetPwdCodeLives    int | 	ResetPwdCodeLives    int | ||||||
|  | 	LdapAuth             bool | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func ExecDir() (string, error) { | func ExecDir() (string, error) { | ||||||
| @ -178,6 +179,36 @@ func newLogService() { | |||||||
| 	log.Info("Log Mode: %s(%s)", strings.Title(LogMode), levelName) | 	log.Info("Log Mode: %s(%s)", strings.Title(LogMode), levelName) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func newLdapService() { | ||||||
|  | 	Service.LdapAuth = Cfg.MustBool("security", "LDAP_AUTH", false) | ||||||
|  | 	if !Service.LdapAuth { | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	nbsrc := 0 | ||||||
|  | 	for _, v := range Cfg.GetSectionList() { | ||||||
|  | 		if matched, _ := regexp.MatchString("(?i)^LDAPSOURCE.*", v); matched { | ||||||
|  | 			ldapname := Cfg.MustValue(v, "name", v) | ||||||
|  | 			ldaphost := Cfg.MustValue(v, "host") | ||||||
|  | 			ldapport := Cfg.MustInt(v, "port", 389) | ||||||
|  | 			ldapbasedn := Cfg.MustValue(v, "basedn", "dc=*,dc=*") | ||||||
|  | 			ldapattribute := Cfg.MustValue(v, "attribute", "mail") | ||||||
|  | 			ldapfilter := Cfg.MustValue(v, "filter", "(*)") | ||||||
|  | 			ldapmsadsaformat := Cfg.MustValue(v, "MSADSAFORMAT", "%s") | ||||||
|  | 			ldap.AddSource(ldapname, ldaphost, ldapport, ldapbasedn, ldapattribute, ldapfilter, ldapmsadsaformat) | ||||||
|  | 			nbsrc++ | ||||||
|  | 			log.Debug("%s added as LDAP source", ldapname) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	if nbsrc == 0 { | ||||||
|  | 		log.Warn("No valide LDAP found, LDAP Authentication NOT enabled") | ||||||
|  | 		Service.LdapAuth = false | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	log.Info("LDAP Authentication Enabled") | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func newCacheService() { | func newCacheService() { | ||||||
| 	CacheAdapter = Cfg.MustValue("cache", "ADAPTER", "memory") | 	CacheAdapter = Cfg.MustValue("cache", "ADAPTER", "memory") | ||||||
| 	if EnableRedis { | 	if EnableRedis { | ||||||
| @ -295,6 +326,7 @@ func NewConfigContext() { | |||||||
| 	AppLogo = Cfg.MustValue("", "APP_LOGO", "img/favicon.png") | 	AppLogo = Cfg.MustValue("", "APP_LOGO", "img/favicon.png") | ||||||
| 	AppUrl = Cfg.MustValue("server", "ROOT_URL") | 	AppUrl = Cfg.MustValue("server", "ROOT_URL") | ||||||
| 	Domain = Cfg.MustValue("server", "DOMAIN") | 	Domain = Cfg.MustValue("server", "DOMAIN") | ||||||
|  | 	OfflineMode = Cfg.MustBool("server", "OFFLINE_MODE", false) | ||||||
| 	SecretKey = Cfg.MustValue("security", "SECRET_KEY") | 	SecretKey = Cfg.MustValue("security", "SECRET_KEY") | ||||||
| 
 | 
 | ||||||
| 	InstallLock = Cfg.MustBool("security", "INSTALL_LOCK", false) | 	InstallLock = Cfg.MustBool("security", "INSTALL_LOCK", false) | ||||||
| @ -312,34 +344,6 @@ func NewConfigContext() { | |||||||
| 	LogInRememberDays = Cfg.MustInt("security", "LOGIN_REMEMBER_DAYS") | 	LogInRememberDays = Cfg.MustInt("security", "LOGIN_REMEMBER_DAYS") | ||||||
| 	CookieUserName = Cfg.MustValue("security", "COOKIE_USERNAME") | 	CookieUserName = Cfg.MustValue("security", "COOKIE_USERNAME") | ||||||
| 	CookieRememberName = Cfg.MustValue("security", "COOKIE_REMEMBER_NAME") | 	CookieRememberName = Cfg.MustValue("security", "COOKIE_REMEMBER_NAME") | ||||||
| 
 |  | ||||||
| 	// load LDAP authentication configuration if present
 |  | ||||||
| 	LdapAuth = Cfg.MustBool("security", "LDAP_AUTH", false) |  | ||||||
| 	if LdapAuth { |  | ||||||
| 		qlog.Debug("LDAP AUTHENTICATION activated") |  | ||||||
| 		nbsrc := 0 |  | ||||||
| 		for _, v := range Cfg.GetSectionList() { |  | ||||||
| 			if matched, _ := regexp.MatchString("(?i)^LDAPSOURCE.*", v); matched { |  | ||||||
| 				ldapname := Cfg.MustValue(v, "name", v) |  | ||||||
| 				ldaphost := Cfg.MustValue(v, "host") |  | ||||||
| 				ldapport := Cfg.MustInt(v, "port", 389) |  | ||||||
| 				ldapbasedn := Cfg.MustValue(v, "basedn", "dc=*,dc=*") |  | ||||||
| 				ldapattribute := Cfg.MustValue(v, "attribute", "mail") |  | ||||||
| 				ldapfilter := Cfg.MustValue(v, "filter", "(*)") |  | ||||||
| 				ldapmsadsaformat := Cfg.MustValue(v, "MSADSAFORMAT", "%s") |  | ||||||
| 				ldap.AddSource(ldapname, ldaphost, ldapport, ldapbasedn, ldapattribute, ldapfilter, ldapmsadsaformat) |  | ||||||
| 				nbsrc += 1 |  | ||||||
| 				qlog.Debug("%s added as LDAP source", ldapname) |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 		if nbsrc == 0 { |  | ||||||
| 			qlog.Debug("No valide LDAP found, LDAP AUTHENTICATION NOT activated") |  | ||||||
| 			LdapAuth = false |  | ||||||
| 		} |  | ||||||
| 	} else { |  | ||||||
| 		qlog.Debug("LDAP AUTHENTICATION NOT activated") |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	PictureService = Cfg.MustValue("picture", "SERVICE") | 	PictureService = Cfg.MustValue("picture", "SERVICE") | ||||||
| 
 | 
 | ||||||
| 	// Determine and create root git reposiroty path.
 | 	// Determine and create root git reposiroty path.
 | ||||||
| @ -357,6 +361,7 @@ func NewConfigContext() { | |||||||
| func NewBaseServices() { | func NewBaseServices() { | ||||||
| 	newService() | 	newService() | ||||||
| 	newLogService() | 	newLogService() | ||||||
|  | 	newLdapService() | ||||||
| 	newCacheService() | 	newCacheService() | ||||||
| 	newSessionService() | 	newSessionService() | ||||||
| 	newMailService() | 	newMailService() | ||||||
|  | |||||||
| @ -56,8 +56,8 @@ var TemplateFuncs template.FuncMap = map[string]interface{}{ | |||||||
| 	"AppDomain": func() string { | 	"AppDomain": func() string { | ||||||
| 		return Domain | 		return Domain | ||||||
| 	}, | 	}, | ||||||
| 	"IsProdMode": func() bool { | 	"CdnMode": func() bool { | ||||||
| 		return IsProdMode | 		return ProdMode && !OfflineMode | ||||||
| 	}, | 	}, | ||||||
| 	"LoadTimes": func(startTime time.Time) string { | 	"LoadTimes": func(startTime time.Time) string { | ||||||
| 		return fmt.Sprint(time.Since(startTime).Nanoseconds()/1e6) + "ms" | 		return fmt.Sprint(time.Since(startTime).Nanoseconds()/1e6) + "ms" | ||||||
| @ -124,11 +124,11 @@ func ActionIcon(opType int) string { | |||||||
| const ( | const ( | ||||||
| 	TPL_CREATE_REPO    = `<a href="/user/%s">%s</a> created repository <a href="/%s">%s</a>` | 	TPL_CREATE_REPO    = `<a href="/user/%s">%s</a> created repository <a href="/%s">%s</a>` | ||||||
| 	TPL_COMMIT_REPO    = `<a href="/user/%s">%s</a> pushed to <a href="/%s/src/%s">%s</a> at <a href="/%s">%s</a>%s` | 	TPL_COMMIT_REPO    = `<a href="/user/%s">%s</a> pushed to <a href="/%s/src/%s">%s</a> at <a href="/%s">%s</a>%s` | ||||||
| 	TPL_COMMIT_REPO_LI = `<div><img src="%s?s=16" alt="user-avatar"/> <a href="/%s/commit/%s">%s</a> %s</div>` | 	TPL_COMMIT_REPO_LI = `<div><img src="%s?s=16" alt="user-avatar"/> <a href="/%s/commit/%s" rel="nofollow">%s</a> %s</div>` | ||||||
| 	TPL_CREATE_ISSUE   = `<a href="/user/%s">%s</a> opened issue <a href="/%s/issues/%s">%s#%s</a> | 	TPL_CREATE_ISSUE   = `<a href="/user/%s">%s</a> opened issue <a href="/%s/issues/%s">%s#%s</a> | ||||||
| <div><img src="%s?s=16" alt="user-avatar"/> %s</div>` | <div><img src="%s?s=16" alt="user-avatar"/> %s</div>` | ||||||
| 	TPL_TRANSFER_REPO = `<a href="/user/%s">%s</a> transfered repository <code>%s</code> to <a href="/%s">%s</a>` | 	TPL_TRANSFER_REPO = `<a href="/user/%s">%s</a> transfered repository <code>%s</code> to <a href="/%s">%s</a>` | ||||||
| 	TPL_PUSH_TAG      = `<a href="/user/%s">%s</a> pushed tag <a href="/%s/src/%s">%s</a> at <a href="/%s">%s</a>` | 	TPL_PUSH_TAG      = `<a href="/user/%s">%s</a> pushed tag <a href="/%s/src/%s" rel="nofollow">%s</a> at <a href="/%s">%s</a>` | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| type PushCommit struct { | type PushCommit struct { | ||||||
| @ -165,7 +165,7 @@ func ActionDesc(act Actioner) string { | |||||||
| 			buf.WriteString(fmt.Sprintf(TPL_COMMIT_REPO_LI, AvatarLink(commit.AuthorEmail), repoLink, commit.Sha1, commit.Sha1[:7], commit.Message) + "\n") | 			buf.WriteString(fmt.Sprintf(TPL_COMMIT_REPO_LI, AvatarLink(commit.AuthorEmail), repoLink, commit.Sha1, commit.Sha1[:7], commit.Message) + "\n") | ||||||
| 		} | 		} | ||||||
| 		if push.Len > 3 { | 		if push.Len > 3 { | ||||||
| 			buf.WriteString(fmt.Sprintf(`<div><a href="/%s/%s/commits/%s">%d other commits >></a></div>`, actUserName, repoName, branch, push.Len)) | 			buf.WriteString(fmt.Sprintf(`<div><a href="/%s/%s/commits/%s" rel="nofollow">%d other commits >></a></div>`, actUserName, repoName, branch, push.Len)) | ||||||
| 		} | 		} | ||||||
| 		return fmt.Sprintf(TPL_COMMIT_REPO, actUserName, actUserName, repoLink, branch, branch, repoLink, repoLink, | 		return fmt.Sprintf(TPL_COMMIT_REPO, actUserName, actUserName, repoLink, branch, branch, repoLink, repoLink, | ||||||
| 			buf.String()) | 			buf.String()) | ||||||
|  | |||||||
| @ -26,11 +26,14 @@ func RepoAssignment(redirect bool, args ...bool) martini.Handler { | |||||||
| 		var displayBare bool | 		var displayBare bool | ||||||
| 
 | 
 | ||||||
| 		if len(args) >= 1 { | 		if len(args) >= 1 { | ||||||
| 			validBranch = args[0] | 			// Note: argument has wrong value in Go1.3 martini.
 | ||||||
|  | 			// validBranch = args[0]
 | ||||||
|  | 			validBranch = true | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		if len(args) >= 2 { | 		if len(args) >= 2 { | ||||||
| 			displayBare = args[1] | 			// displayBare = args[1]
 | ||||||
|  | 			displayBare = true | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		var ( | 		var ( | ||||||
|  | |||||||
							
								
								
									
										
											BIN
										
									
								
								public/img/favicon.bak.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								public/img/favicon.bak.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 16 KiB | 
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 11 KiB | 
| @ -468,13 +468,28 @@ function initRepository() { | |||||||
| function initInstall() { | function initInstall() { | ||||||
|     // database type change
 |     // database type change
 | ||||||
|     (function () { |     (function () { | ||||||
|  |         var mysql_default    = '127.0.0.1:3306' | ||||||
|  |         var postgres_default = '127.0.0.1:5432' | ||||||
|  | 
 | ||||||
|         $('#install-database').on("change", function () { |         $('#install-database').on("change", function () { | ||||||
|             var val = $(this).val(); |             var val = $(this).val(); | ||||||
|             if (val != "sqlite") { |             if (val != "SQLite3") { | ||||||
|                 $('.server-sql').show(); |                 $('.server-sql').show(); | ||||||
|                 $('.sqlite-setting').addClass("hide"); |                 $('.sqlite-setting').addClass("hide"); | ||||||
|                 if (val == "pgsql") { |                 if (val == "PostgreSQL") { | ||||||
|                     $('.pgsql-setting').removeClass("hide"); |                     $('.pgsql-setting').removeClass("hide"); | ||||||
|  | 
 | ||||||
|  |                     // Change the host value to the Postgres default, but only
 | ||||||
|  |                     // if the user hasn't already changed it from the MySQL
 | ||||||
|  |                     // default.
 | ||||||
|  |                     if ($('#database-host').val() == mysql_default) { | ||||||
|  |                         $('#database-host').val(postgres_default); | ||||||
|  |                     } | ||||||
|  |                 } else if (val == 'MySQL') { | ||||||
|  |                     $('.pgsql-setting').addClass("hide"); | ||||||
|  |                     if ($('#database-host').val() == postgres_default) { | ||||||
|  |                         $('#database-host').val(mysql_default); | ||||||
|  |                     } | ||||||
|                 } else { |                 } else { | ||||||
|                     $('.pgsql-setting').addClass("hide"); |                     $('.pgsql-setting').addClass("hide"); | ||||||
|                 } |                 } | ||||||
|  | |||||||
| @ -139,9 +139,11 @@ func Config(ctx *middleware.Context) { | |||||||
| 
 | 
 | ||||||
| 	ctx.Data["AppUrl"] = base.AppUrl | 	ctx.Data["AppUrl"] = base.AppUrl | ||||||
| 	ctx.Data["Domain"] = base.Domain | 	ctx.Data["Domain"] = base.Domain | ||||||
|  | 	ctx.Data["OfflineMode"] = base.OfflineMode | ||||||
| 	ctx.Data["RunUser"] = base.RunUser | 	ctx.Data["RunUser"] = base.RunUser | ||||||
| 	ctx.Data["RunMode"] = strings.Title(martini.Env) | 	ctx.Data["RunMode"] = strings.Title(martini.Env) | ||||||
| 	ctx.Data["RepoRootPath"] = base.RepoRootPath | 	ctx.Data["RepoRootPath"] = base.RepoRootPath | ||||||
|  | 	ctx.Data["ScriptType"] = base.ScriptType | ||||||
| 
 | 
 | ||||||
| 	ctx.Data["Service"] = base.Service | 	ctx.Data["Service"] = base.Service | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -30,7 +30,7 @@ func checkRunMode() { | |||||||
| 	switch base.Cfg.MustValue("", "RUN_MODE") { | 	switch base.Cfg.MustValue("", "RUN_MODE") { | ||||||
| 	case "prod": | 	case "prod": | ||||||
| 		martini.Env = martini.Prod | 		martini.Env = martini.Prod | ||||||
| 		base.IsProdMode = true | 		base.ProdMode = true | ||||||
| 	case "test": | 	case "test": | ||||||
| 		martini.Env = martini.Test | 		martini.Env = martini.Test | ||||||
| 	} | 	} | ||||||
| @ -65,6 +65,10 @@ func GlobalInit() { | |||||||
| 	checkRunMode() | 	checkRunMode() | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func renderDbOption(ctx *middleware.Context) { | ||||||
|  | 	ctx.Data["DbOptions"] = []string{"MySQL", "PostgreSQL", "SQLite3"} | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func Install(ctx *middleware.Context, form auth.InstallForm) { | func Install(ctx *middleware.Context, form auth.InstallForm) { | ||||||
| 	if base.InstallLock { | 	if base.InstallLock { | ||||||
| 		ctx.Handle(404, "install.Install", errors.New("Installation is prohibited")) | 		ctx.Handle(404, "install.Install", errors.New("Installation is prohibited")) | ||||||
| @ -104,6 +108,13 @@ func Install(ctx *middleware.Context, form auth.InstallForm) { | |||||||
| 		form.AppUrl = base.AppUrl | 		form.AppUrl = base.AppUrl | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	renderDbOption(ctx) | ||||||
|  | 	curDbValue := "" | ||||||
|  | 	if models.EnableSQLite3 { | ||||||
|  | 		curDbValue = "SQLite3" // Default when enabled.
 | ||||||
|  | 	} | ||||||
|  | 	ctx.Data["CurDbValue"] = curDbValue | ||||||
|  | 
 | ||||||
| 	auth.AssignForm(form, ctx.Data) | 	auth.AssignForm(form, ctx.Data) | ||||||
| 	ctx.HTML(200, "install") | 	ctx.HTML(200, "install") | ||||||
| } | } | ||||||
| @ -117,6 +128,9 @@ func InstallPost(ctx *middleware.Context, form auth.InstallForm) { | |||||||
| 	ctx.Data["Title"] = "Install" | 	ctx.Data["Title"] = "Install" | ||||||
| 	ctx.Data["PageIsInstall"] = true | 	ctx.Data["PageIsInstall"] = true | ||||||
| 
 | 
 | ||||||
|  | 	renderDbOption(ctx) | ||||||
|  | 	ctx.Data["CurDbValue"] = form.Database | ||||||
|  | 
 | ||||||
| 	if ctx.HasError() { | 	if ctx.HasError() { | ||||||
| 		ctx.HTML(200, "install") | 		ctx.HTML(200, "install") | ||||||
| 		return | 		return | ||||||
| @ -129,7 +143,7 @@ func InstallPost(ctx *middleware.Context, form auth.InstallForm) { | |||||||
| 
 | 
 | ||||||
| 	// Pass basic check, now test configuration.
 | 	// Pass basic check, now test configuration.
 | ||||||
| 	// Test database setting.
 | 	// Test database setting.
 | ||||||
| 	dbTypes := map[string]string{"mysql": "mysql", "pgsql": "postgres", "sqlite": "sqlite3"} | 	dbTypes := map[string]string{"MySQL": "mysql", "PostgreSQL": "postgres", "SQLite3": "sqlite3"} | ||||||
| 	models.DbCfg.Type = dbTypes[form.Database] | 	models.DbCfg.Type = dbTypes[form.Database] | ||||||
| 	models.DbCfg.Host = form.Host | 	models.DbCfg.Host = form.Host | ||||||
| 	models.DbCfg.User = form.User | 	models.DbCfg.User = form.User | ||||||
|  | |||||||
| @ -91,10 +91,23 @@ func Diff(ctx *middleware.Context, params martini.Params) { | |||||||
| 		return isImage | 		return isImage | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	parents := make([]string, commit.ParentCount()) | ||||||
|  | 	for i := 0; i < commit.ParentCount(); i++ { | ||||||
|  | 		sha, err := commit.ParentId(i) | ||||||
|  | 		parents[i] = sha.String() | ||||||
|  | 		if err != nil { | ||||||
|  | 			ctx.Handle(404, "repo.Diff", err) | ||||||
|  | 			return | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	ctx.Data["Username"] = userName | ||||||
|  | 	ctx.Data["Reponame"] = repoName | ||||||
| 	ctx.Data["IsImageFile"] = isImageFile | 	ctx.Data["IsImageFile"] = isImageFile | ||||||
| 	ctx.Data["Title"] = commit.Message() + " · " + base.ShortSha(commitId) | 	ctx.Data["Title"] = commit.Summary() + " · " + base.ShortSha(commitId) | ||||||
| 	ctx.Data["Commit"] = commit | 	ctx.Data["Commit"] = commit | ||||||
| 	ctx.Data["Diff"] = diff | 	ctx.Data["Diff"] = diff | ||||||
|  | 	ctx.Data["Parents"] = parents | ||||||
| 	ctx.Data["DiffNotAvailable"] = diff.NumFiles() == 0 | 	ctx.Data["DiffNotAvailable"] = diff.NumFiles() == 0 | ||||||
| 	ctx.Data["IsRepoToolbarCommits"] = true | 	ctx.Data["IsRepoToolbarCommits"] = true | ||||||
| 	ctx.Data["SourcePath"] = "/" + path.Join(userName, repoName, "src", commitId) | 	ctx.Data["SourcePath"] = "/" + path.Join(userName, repoName, "src", commitId) | ||||||
|  | |||||||
| @ -166,7 +166,8 @@ func SettingSSHKeys(ctx *middleware.Context, form auth.AddSSHKeyForm) { | |||||||
| 			return | 			return | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		k := &models.PublicKey{OwnerId: ctx.User.Id, | 		k := &models.PublicKey{ | ||||||
|  | 			OwnerId: ctx.User.Id, | ||||||
| 			Name:    form.KeyName, | 			Name:    form.KeyName, | ||||||
| 			Content: form.KeyContent, | 			Content: form.KeyContent, | ||||||
| 		} | 		} | ||||||
|  | |||||||
| @ -91,12 +91,14 @@ func SignInPost(ctx *middleware.Context, form auth.LogInForm) { | |||||||
| 
 | 
 | ||||||
| 	var user *models.User | 	var user *models.User | ||||||
| 	var err error | 	var err error | ||||||
| 	// try to login against LDAP if defined
 | 	if base.Service.LdapAuth { | ||||||
| 	if base.LdapAuth { |  | ||||||
| 		user, err = models.LoginUserLdap(form.UserName, form.Password) | 		user, err = models.LoginUserLdap(form.UserName, form.Password) | ||||||
|  | 		if err != nil { | ||||||
|  | 			log.Error("Fail to login through LDAP: %v", err) | ||||||
|  | 		} | ||||||
| 	} | 	} | ||||||
| 	// try local if not LDAP or it's failed
 | 	// try local if not LDAP or it's failed
 | ||||||
| 	if (!base.LdapAuth) || (err != nil) { | 	if !base.Service.LdapAuth || err != nil { | ||||||
| 		user, err = models.LoginUserPlain(form.UserName, form.Password) | 		user, err = models.LoginUserPlain(form.UserName, form.Password) | ||||||
| 	} | 	} | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| @ -142,27 +144,6 @@ func SignInPost(ctx *middleware.Context, form auth.LogInForm) { | |||||||
| 	ctx.Redirect("/") | 	ctx.Redirect("/") | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func oauthSignInPost(ctx *middleware.Context, sid int64) { |  | ||||||
| 	ctx.Data["Title"] = "OAuth Sign Up" |  | ||||||
| 	ctx.Data["PageIsSignUp"] = true |  | ||||||
| 
 |  | ||||||
| 	if _, err := models.GetOauth2ById(sid); err != nil { |  | ||||||
| 		if err == models.ErrOauth2RecordNotExist { |  | ||||||
| 			ctx.Handle(404, "user.oauthSignUp(GetOauth2ById)", err) |  | ||||||
| 		} else { |  | ||||||
| 			ctx.Handle(500, "user.oauthSignUp(GetOauth2ById)", err) |  | ||||||
| 		} |  | ||||||
| 		return |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	ctx.Data["IsSocialLogin"] = true |  | ||||||
| 	ctx.Data["username"] = ctx.Session.Get("socialName") |  | ||||||
| 	ctx.Data["email"] = ctx.Session.Get("socialEmail") |  | ||||||
| 	log.Trace("user.oauthSignUp(social ID): %v", ctx.Session.Get("socialId")) |  | ||||||
| 
 |  | ||||||
| 	ctx.HTML(200, "user/signup") |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func SignOut(ctx *middleware.Context) { | func SignOut(ctx *middleware.Context) { | ||||||
| 	ctx.Session.Delete("userId") | 	ctx.Session.Delete("userId") | ||||||
| 	ctx.Session.Delete("userName") | 	ctx.Session.Delete("userName") | ||||||
|  | |||||||
| @ -18,6 +18,8 @@ | |||||||
|                     <dd>{{.AppUrl}}</dd> |                     <dd>{{.AppUrl}}</dd> | ||||||
|                     <dt>Domain</dt> |                     <dt>Domain</dt> | ||||||
|                     <dd>{{.Domain}}</dd> |                     <dd>{{.Domain}}</dd> | ||||||
|  |                     <dt>Offline Mode</dt> | ||||||
|  |                     <dd><i class="fa fa{{if .OfflineMode}}-check{{end}}-square-o"></i></dd> | ||||||
|                     <hr/> |                     <hr/> | ||||||
|                     <dt>Run User</dt> |                     <dt>Run User</dt> | ||||||
|                     <dd>{{.RunUser}}</dd> |                     <dd>{{.RunUser}}</dd> | ||||||
| @ -26,6 +28,8 @@ | |||||||
|                     <hr/> |                     <hr/> | ||||||
|                     <dt>Repository Root Path</dt> |                     <dt>Repository Root Path</dt> | ||||||
|                     <dd>{{.RepoRootPath}}</dd> |                     <dd>{{.RepoRootPath}}</dd> | ||||||
|  |                     <dt>Script Type</dt> | ||||||
|  |                     <dd>{{.ScriptType}}</dd> | ||||||
|                 </dl> |                 </dl> | ||||||
|             </div> |             </div> | ||||||
|         </div> |         </div> | ||||||
|  | |||||||
| @ -13,7 +13,10 @@ | |||||||
| 	    	<div class="col-md-1" style="margin: -5px;"> | 	    	<div class="col-md-1" style="margin: -5px;"> | ||||||
| 		        <a target="_blank" href="https://github.com/gogits/gogs"><i class="fa fa-github fa-2x"></i></a> | 		        <a target="_blank" href="https://github.com/gogits/gogs"><i class="fa fa-github fa-2x"></i></a> | ||||||
| 	        </div> | 	        </div> | ||||||
| 	        <p class="desc"></p> | 
 | ||||||
|  | 	    	<div class="col-md-5"> | ||||||
|  | 	        	<p class="desc"></p> | ||||||
|  | 	        </div> | ||||||
|     	</div> |     	</div> | ||||||
|     </div> |     </div> | ||||||
| </footer> | </footer> | ||||||
|  | |||||||
| @ -12,7 +12,7 @@ | |||||||
| 		{{if .Repository.IsGoget}}<meta name="go-import" content="{{.GoGetImport}} git {{.CloneLink.HTTPS}}">{{end}} | 		{{if .Repository.IsGoget}}<meta name="go-import" content="{{.GoGetImport}} git {{.CloneLink.HTTPS}}">{{end}} | ||||||
| 
 | 
 | ||||||
| 		 <!-- Stylesheets --> | 		 <!-- Stylesheets --> | ||||||
| 		{{if IsProdMode}} | 		{{if CdnMode}} | ||||||
| 		<link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css"> | 		<link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css"> | ||||||
| 		<link href="//netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.css" rel="stylesheet"> | 		<link href="//netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.css" rel="stylesheet"> | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -3,7 +3,7 @@ | |||||||
|         <nav class="nav"> |         <nav class="nav"> | ||||||
|             <a id="nav-logo" class="nav-item pull-left{{if .PageIsHome}} active{{end}}" href="/"><img src="/img/favicon.png" alt="Gogs Logo" id="logo"></a> |             <a id="nav-logo" class="nav-item pull-left{{if .PageIsHome}} active{{end}}" href="/"><img src="/img/favicon.png" alt="Gogs Logo" id="logo"></a> | ||||||
|             <a class="nav-item pull-left{{if .PageIsUserDashboard}} active{{end}}" href="/">Dashboard</a> |             <a class="nav-item pull-left{{if .PageIsUserDashboard}} active{{end}}" href="/">Dashboard</a> | ||||||
|             <a class="nav-item pull-left{{if .PageIsHelp}} active{{end}}" href="https://github.com/gogits/gogs/wiki">Help</a>{{if .IsSigned}} |             <a class="nav-item pull-left{{if .PageIsHelp}} active{{end}}" target="_blank" href="https://github.com/gogits/gogs/wiki">Help</a>{{if .IsSigned}} | ||||||
|             {{if .HasAccess}}<!-- <form class="nav-item pull-left{{if .PageIsNewRepo}} active{{end}}" id="nav-search-form"> |             {{if .HasAccess}}<!-- <form class="nav-item pull-left{{if .PageIsNewRepo}} active{{end}}" id="nav-search-form"> | ||||||
|                 <div class="input-group"> |                 <div class="input-group"> | ||||||
|                     <div class="input-group-btn"> |                     <div class="input-group-btn"> | ||||||
| @ -33,8 +33,8 @@ | |||||||
|                     </ul> |                     </ul> | ||||||
|                 </div> |                 </div> | ||||||
|             </div> |             </div> | ||||||
|             {{else}}<a id="nav-signin" class="nav-item navbar-right navbar-btn btn btn-danger" href="/user/login/">Sign In</a> |             {{else}}<a id="nav-signin" class="nav-item navbar-right navbar-btn btn btn-danger" href="/user/login/" rel="nofollow">Sign In</a> | ||||||
|             <a id="nav-signup" class="nav-item navbar-right" href="/user/sign_up/">Sign Up</a>{{end}} |             <a id="nav-signup" class="nav-item navbar-right" href="/user/sign_up/" rel="nofollow">Sign Up</a>{{end}} | ||||||
|         </nav> |         </nav> | ||||||
|     </div> |     </div> | ||||||
| </div> | </div> | ||||||
|  | |||||||
| @ -9,18 +9,19 @@ | |||||||
|             <label class="col-md-3 control-label">Database Type: </label> |             <label class="col-md-3 control-label">Database Type: </label> | ||||||
|             <div class="col-md-8"> |             <div class="col-md-8"> | ||||||
|                 <select name="database" id="install-database" class="form-control"> |                 <select name="database" id="install-database" class="form-control"> | ||||||
|                     <option value="mysql">MySQL</option> |                     {{if .CurDbValue}}<option value="{{.CurDbValue}}">{{.CurDbValue}}</option>{{end}} | ||||||
|                     <option value="pgsql">PostgreSQL</option> |                     {{range .DbOptions}} | ||||||
|                     <option value="sqlite">SQLite3</option> |                     {{if not (eq $.CurDbValue .)}}<option value="{{.}}">{{.}}</option>{{end}} | ||||||
|  |                     {{end}} | ||||||
|                 </select> |                 </select> | ||||||
|             </div> |             </div> | ||||||
|         </div> |         </div> | ||||||
| 
 | 
 | ||||||
|         <div class="server-sql"> |         <div class="server-sql {{if eq .CurDbValue "SQLite3"}}hide{{end}}"> | ||||||
|             <div class="form-group"> |             <div class="form-group"> | ||||||
|                 <label class="col-md-3 control-label">Host: </label> |                 <label class="col-md-3 control-label">Host: </label> | ||||||
|                 <div class="col-md-8"> |                 <div class="col-md-8"> | ||||||
|                     <input name="host" class="form-control" placeholder="Type database server host" value="{{.host}}"> |                     <input name="host" id="database-host" class="form-control" placeholder="Type database server host" value="{{.host}}"> | ||||||
|                 </div> |                 </div> | ||||||
|             </div> |             </div> | ||||||
| 
 | 
 | ||||||
| @ -49,7 +50,7 @@ | |||||||
|                 </div> |                 </div> | ||||||
|             </div> |             </div> | ||||||
| 
 | 
 | ||||||
|             <div class="form-group pgsql-setting hide"> |             <div class="form-group pgsql-setting {{if not (eq .CurDbValue "PostgreSQL")}}hide{{end}}"> | ||||||
|                 <label class="col-md-3 control-label">SSL Mode: </label> |                 <label class="col-md-3 control-label">SSL Mode: </label> | ||||||
|                 <div class="col-md-8"> |                 <div class="col-md-8"> | ||||||
|                     <select name="ssl_mode" class="form-control"> |                     <select name="ssl_mode" class="form-control"> | ||||||
| @ -61,7 +62,7 @@ | |||||||
|             </div> |             </div> | ||||||
|         </div> |         </div> | ||||||
| 
 | 
 | ||||||
|         <div class="sqlite-setting hide"> |         <div class="sqlite-setting {{if not (eq .CurDbValue "SQLite3")}}hide{{end}}"> | ||||||
|             <div class="form-group"> |             <div class="form-group"> | ||||||
|                 <label class="col-md-3 control-label">Path: </label> |                 <label class="col-md-3 control-label">Path: </label> | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -15,8 +15,8 @@ | |||||||
|                 {{if .PublisherId}} |                 {{if .PublisherId}} | ||||||
|                 <div class="col-md-2 text-right"> |                 <div class="col-md-2 text-right"> | ||||||
|                     {{if .IsPrerelease}}<span class="btn btn-warning status pre-release">Pre-Release</span>{{else}}<span class="btn btn-success status stable">Stable</span>{{end}} |                     {{if .IsPrerelease}}<span class="btn btn-warning status pre-release">Pre-Release</span>{{else}}<span class="btn btn-success status stable">Stable</span>{{end}} | ||||||
|                     <a class="tag" href="{{$.RepoLink}}/src/{{.TagName}}"><i class="fa fa-tag"></i>{{.TagName}}</a> |                     <a class="tag" href="{{$.RepoLink}}/src/{{.TagName}}" rel="nofollow"><i class="fa fa-tag"></i>{{.TagName}}</a> | ||||||
|                     <a class="commit" href="{{$.RepoLink}}/src/{{.SHA1}}"><i class="fa fa-code"></i>{{ShortSha .SHA1}}</a> |                     <a class="commit" href="{{$.RepoLink}}/src/{{.SHA1}}" rel="nofollow"><i class="fa fa-code"></i>{{ShortSha .SHA1}}</a> | ||||||
|                 </div> |                 </div> | ||||||
|                 <div class="col-md-10"> |                 <div class="col-md-10"> | ||||||
|                     <h4 class="title"><a href="{{$.RepoLink}}/src/{{.TagName}}">{{.Title}}</a></h4> |                     <h4 class="title"><a href="{{$.RepoLink}}/src/{{.TagName}}">{{.Title}}</a></h4> | ||||||
| @ -30,19 +30,19 @@ | |||||||
|                         {{str2html .Note}} |                         {{str2html .Note}} | ||||||
|                     </div> |                     </div> | ||||||
|                     <p class="download"> |                     <p class="download"> | ||||||
|                         <a class="btn btn-default" href="{{$.RepoLink}}/archive/{{.TagName}}/{{$.Repository.Name}}.zip"><i class="fa fa-download"></i>Source Code (ZIP)</a> |                         <a class="btn btn-default" href="{{$.RepoLink}}/archive/{{.TagName}}/{{$.Repository.Name}}.zip" rel="nofollow"><i class="fa fa-download"></i>Source Code (ZIP)</a> | ||||||
|                         <!-- <a class="btn btn-default" href="{release_download_link}"><i class="fa fa-download"></i>Source Code (TAR.GZ)</a> --> |                         <!-- <a class="btn btn-default" href="{release_download_link}"><i class="fa fa-download"></i>Source Code (TAR.GZ)</a> --> | ||||||
|                     </p> |                     </p> | ||||||
|                     <span class="dot"> </span> |                     <span class="dot"> </span> | ||||||
|                 </div> |                 </div> | ||||||
|                 {{else}} |                 {{else}} | ||||||
|                 <div class="col-md-2 text-right"> |                 <div class="col-md-2 text-right"> | ||||||
|                     <a class="commit" href="{{$.RepoLink}}/src/{{.SHA1}}"><i class="fa fa-code"></i>{{ShortSha .SHA1}}</a> |                     <a class="commit" href="{{$.RepoLink}}/src/{{.SHA1}}" rel="nofollow"><i class="fa fa-code"></i>{{ShortSha .SHA1}}</a> | ||||||
|                 </div> |                 </div> | ||||||
|                 <div class="col-md-10"> |                 <div class="col-md-10"> | ||||||
|                     <h5 class="title"><a href="{{$.RepoLink}}/src/{{.TagName}}">{{.TagName}}</a><i class="fa fa-tag"></i></h5> |                     <h5 class="title"><a href="{{$.RepoLink}}/src/{{.TagName}}" rel="nofollow">{{.TagName}}</a><i class="fa fa-tag"></i></h5> | ||||||
|                     <p class="download"> |                     <p class="download"> | ||||||
|                         <a class="download-link" href="{{$.RepoLink}}/archive/{{.TagName}}/{{$.Repository.Name}}.zip"><i class="fa fa-download"></i>zip</a> |                         <a class="download-link" href="{{$.RepoLink}}/archive/{{.TagName}}/{{$.Repository.Name}}.zip" rel="nofollow"><i class="fa fa-download"></i>zip</a> | ||||||
|                         <!-- <a class="download-link" href="{release_download_link}"><i class="fa fa-download"></i>tar.gz</a> --> |                         <!-- <a class="download-link" href="{release_download_link}"><i class="fa fa-download"></i>tar.gz</a> --> | ||||||
|                     </p> |                     </p> | ||||||
|                     <span class="dot"> </span> |                     <span class="dot"> </span> | ||||||
| @ -50,30 +50,6 @@ | |||||||
|                 {{end}} |                 {{end}} | ||||||
|             </li> |             </li> | ||||||
|             {{end}} |             {{end}} | ||||||
|             <!-- <li class="release-item clearfix" id="release-{release_id}"> |  | ||||||
|                 <div class="col-md-2 text-right"> |  | ||||||
|                     <span class="btn btn-warning status pre-release">Pre-Release</span> |  | ||||||
|                     <a class="tag" href="{commit_link}"><i class="fa fa-tag"></i>release tag</a> |  | ||||||
|                     <a class="commit" href="{commit_link}"><i class="fa fa-code"></i>commit-sha</a> |  | ||||||
|                 </div> |  | ||||||
|                 <div class="col-md-10"> |  | ||||||
|                     <h4 class="title"><a href="{release_single_link}">Release Title</a></h4> |  | ||||||
|                     <p class="info"> |  | ||||||
|                         <span class="author"><img class="avatar" src="http://1.gravatar.com/avatar/f72f7454ce9d710baa506394f68f4132" alt="" width="20">   |  | ||||||
|                         <a href="/user/fuxiaohei">fuxiaohei</a></span> |  | ||||||
|                         <span class="time">1 week ago</span> |  | ||||||
|                         <span class="ahead"><strong>0</strong> commits since this tag</span> |  | ||||||
|                     </p> |  | ||||||
|                     <div class="markdown desc"> |  | ||||||
|                         release descriptions, support markdown content |  | ||||||
|                     </div> |  | ||||||
|                     <p class="download"> |  | ||||||
|                         <a class="btn btn-default" href="{release_download_link}"><i class="fa fa-download"></i>Source Code (ZIP)</a> |  | ||||||
|                         <a class="btn btn-default" href="{release_download_link}"><i class="fa fa-download"></i>Source Code (TAR.GZ)</a> |  | ||||||
|                     </p> |  | ||||||
|                     <span class="dot"> </span> |  | ||||||
|                 </div> |  | ||||||
|             </li> --> |  | ||||||
|         </ul> |         </ul> | ||||||
|     </div> |     </div> | ||||||
| </div> | </div> | ||||||
|  | |||||||
| @ -33,7 +33,7 @@ | |||||||
|                 <tr> |                 <tr> | ||||||
|                     <td class="author"><img class="avatar" src="{{AvatarLink .Author.Email}}" alt=""/><a href="/user/email2user?email={{.Author.Email}}">{{.Author.Name}}</a></td> |                     <td class="author"><img class="avatar" src="{{AvatarLink .Author.Email}}" alt=""/><a href="/user/email2user?email={{.Author.Email}}">{{.Author.Name}}</a></td> | ||||||
|                     <td class="sha"><a rel="nofollow" class="label label-success" href="/{{$username}}/{{$reponame}}/commit/{{.Id}} ">{{SubStr .Id.String 0 10}} </a></td> |                     <td class="sha"><a rel="nofollow" class="label label-success" href="/{{$username}}/{{$reponame}}/commit/{{.Id}} ">{{SubStr .Id.String 0 10}} </a></td> | ||||||
|                     <td class="message">{{.Message}} </td> |                     <td class="message">{{.Summary}} </td> | ||||||
|                     <td class="date">{{TimeSince .Author.When}}</td> |                     <td class="date">{{TimeSince .Author.When}}</td> | ||||||
|                 </tr> |                 </tr> | ||||||
|                 {{end}} |                 {{end}} | ||||||
| @ -41,8 +41,8 @@ | |||||||
|             </table> |             </table> | ||||||
|         </div> |         </div> | ||||||
|         {{if not .IsSearchPage}}<ul class="pagination" id="commits-pager"> |         {{if not .IsSearchPage}}<ul class="pagination" id="commits-pager"> | ||||||
|             {{if .LastPageNum}}<li><a href="{{.RepoLink}}/commits/{{.BranchName}}?p={{.LastPageNum}}">« Newer</a></li>{{end}} |             {{if .LastPageNum}}<li><a href="{{.RepoLink}}/commits/{{.BranchName}}?p={{.LastPageNum}}" rel="nofollow">« Newer</a></li>{{end}} | ||||||
|             {{if .NextPageNum}}<li><a href="{{.RepoLink}}/commits/{{.BranchName}}?p={{.NextPageNum}}">» Older</a></li>{{end}} |             {{if .NextPageNum}}<li><a href="{{.RepoLink}}/commits/{{.BranchName}}?p={{.NextPageNum}}" rel="nofollow">» Older</a></li>{{end}} | ||||||
|         </ul>{{end}} |         </ul>{{end}} | ||||||
|     </div> |     </div> | ||||||
| </div> | </div> | ||||||
|  | |||||||
| @ -10,7 +10,12 @@ | |||||||
|             </div> |             </div> | ||||||
|             <div class="panel-body"> |             <div class="panel-body"> | ||||||
|                 <span class="pull-right"> |                 <span class="pull-right"> | ||||||
|                     commit <span class="label label-default sha">{{ShortSha .CommitId}}</span> |                 <ul class="list-unstyled"> | ||||||
|  |                     {{range .Parents}} | ||||||
|  |                     <li>parent <a href="{{$.RepoLink}}/commit/{{.}}"><span class="label label-default sha">{{ShortSha .}}</span></a></li> | ||||||
|  |                     {{end}} | ||||||
|  |                     <li>commit <span class="label label-default sha">{{ShortSha .CommitId}}</span></li> | ||||||
|  |                 </ul> | ||||||
|                 </span> |                 </span> | ||||||
|                 <p class="author"> |                 <p class="author"> | ||||||
|                     <img class="avatar" src="{{AvatarLink .Commit.Author.Email}}" alt=""/> |                     <img class="avatar" src="{{AvatarLink .Commit.Author.Email}}" alt=""/> | ||||||
|  | |||||||
| @ -23,10 +23,10 @@ | |||||||
|                                 <button class="btn btn-default" type="button" data-toggle="tooltip" title="copy to clipboard" data-placement="top" data-init="copy" data-copy-val="val" data-copy-from="#repo-clone-ipt"><i class="fa fa-copy"></i></button> |                                 <button class="btn btn-default" type="button" data-toggle="tooltip" title="copy to clipboard" data-placement="top" data-init="copy" data-copy-val="val" data-copy-from="#repo-clone-ipt"><i class="fa fa-copy"></i></button> | ||||||
|                             </span> |                             </span> | ||||||
|                         </div> |                         </div> | ||||||
|                         <p class="help-block text-center">Need help cloning? Visit <a href="#">Help</a>!</p> |                         <p class="help-block text-center">Need help cloning? Visit <a target="_blank" href="https://help.github.com/articles/fork-a-repo">Help</a>!</p> | ||||||
|                         <hr/> |                         <hr/> | ||||||
|                         <div class="clone-zip text-center"> |                         <div class="clone-zip text-center"> | ||||||
|                             <a class="btn btn-success btn-lg" href="{{.RepoLink}}/archive/{{.BranchName}}/{{.Repository.Name}}.zip"><i class="fa fa-suitcase"></i>Download ZIP</a> |                             <a class="btn btn-success btn-lg" href="{{.RepoLink}}/archive/{{.BranchName}}/{{.Repository.Name}}.zip" rel="nofollow"><i class="fa fa-suitcase"></i>Download ZIP</a> | ||||||
|                         </div> |                         </div> | ||||||
|                     </div> |                     </div> | ||||||
|                 </div> |                 </div> | ||||||
|  | |||||||
| @ -14,37 +14,38 @@ | |||||||
|         {{if not .ReadmeInSingle}} |         {{if not .ReadmeInSingle}} | ||||||
|         <div class="btn-group pull-right"> |         <div class="btn-group pull-right"> | ||||||
|             <a class="btn btn-default hidden" href="#">Edit</a> |             <a class="btn btn-default hidden" href="#">Edit</a> | ||||||
|             <a class="btn btn-default" href="{{.FileLink}}">Raw</a> |             <a class="btn btn-default" href="{{.FileLink}}" rel="nofollow">Raw</a> | ||||||
|             <a class="btn btn-default hidden" href="#">Blame</a> |             <a class="btn btn-default hidden" href="#">Blame</a> | ||||||
|             <a class="btn btn-default hidden" href="#">History</a> |             <a class="btn btn-default hidden" href="#">History</a> | ||||||
|             <a class="btn btn-danger hidden" href="#">Delete</a> |             <a class="btn btn-danger hidden" href="#">Delete</a> | ||||||
|         </div> |         </div> | ||||||
|         {{end}} |         {{end}} | ||||||
|     </div> |     </div> | ||||||
|  |      | ||||||
|     {{if not .FileIsText}} |     {{if not .FileIsText}} | ||||||
|         <div class="panel-footer text-center"> |     <div class="panel-body file-body file-code code-view"> | ||||||
|             {{if .IsImageFile}} |         {{if .IsImageFile}} | ||||||
|                 <img src="{{.FileLink}}"> |             <img src="{{.FileLink}}"> | ||||||
|             {{else}} |  | ||||||
|                 <a href="{{.FileLink}}" class="btn btn-default">View Raw</a> |  | ||||||
|             {{end}} |  | ||||||
|         </div> |  | ||||||
|     {{else}} |  | ||||||
|         {{if .ReadmeExist}} |  | ||||||
|             <div class="panel-body file-body markdown"> |  | ||||||
|                 {{.FileContent|str2html}} |  | ||||||
|             </div> |  | ||||||
|         {{else}} |         {{else}} | ||||||
|             <div class="panel-body file-body file-code code-view"> |             <a href="{{.FileLink}}" rel="nofollow" class="btn btn-default">View Raw</a> | ||||||
|                 <table> |  | ||||||
|                     <tbody> |  | ||||||
|                         <tr> |  | ||||||
|                             <td class="lines-num"></td> |  | ||||||
|                             <td class="lines-code markdown"><pre class="prettyprint linenums{{if .FileExt}} lang-{{.FileExt}}{{end}}">{{.FileContent}}</pre></td> |  | ||||||
|                         </tr> |  | ||||||
|                     </tbody> |  | ||||||
|                 </table> |  | ||||||
|             </div> |  | ||||||
|         {{end}} |         {{end}} | ||||||
|  |     </div> | ||||||
|  |     {{else}} | ||||||
|  |     {{if .ReadmeExist}} | ||||||
|  |     <div class="panel-body file-body markdown"> | ||||||
|  |         {{.FileContent|str2html}} | ||||||
|  |     </div> | ||||||
|  |     {{else}} | ||||||
|  |     <div class="panel-body file-body file-code code-view"> | ||||||
|  |         <table> | ||||||
|  |             <tbody> | ||||||
|  |                 <tr> | ||||||
|  |                     <td class="lines-num"></td> | ||||||
|  |                     <td class="lines-code markdown"><pre class="prettyprint linenums{{if .FileExt}} lang-{{.FileExt}}{{end}}">{{.FileContent}}</pre></td> | ||||||
|  |                 </tr> | ||||||
|  |             </tbody> | ||||||
|  |         </table> | ||||||
|  |     </div> | ||||||
|  |     {{end}} | ||||||
|     {{end}} |     {{end}} | ||||||
| </div> | </div> | ||||||
|  | |||||||
| @ -1,6 +1,6 @@ | |||||||
| <div class="panel panel-default info-box"> | <div class="panel panel-default info-box"> | ||||||
|     <div class="panel-heading info-head"> |     <div class="panel-heading info-head"> | ||||||
|         <a href="/{{.Username}}/{{.Reponame}}/commit/{{.LastCommit.Id}}">{{.LastCommit.Message}}</a> |         <a href="/{{.Username}}/{{.Reponame}}/commit/{{.LastCommit.Id}}" rel="nofollow">{{.LastCommit.Summary}}</a> | ||||||
|     </div> |     </div> | ||||||
|     <div class="panel-body info-content"> |     <div class="panel-body info-content"> | ||||||
|         <a href="/user/{{.LastCommit.Author.Name}}">{{.LastCommit.Author.Name}}</a> <span class="text-muted">{{TimeSince .LastCommit.Author.When}}</span> |         <a href="/user/{{.LastCommit.Author.Name}}">{{.LastCommit.Author.Name}}</a> <span class="text-muted">{{TimeSince .LastCommit.Author.When}}</span> | ||||||
| @ -36,7 +36,7 @@ | |||||||
|                         </span> |                         </span> | ||||||
|                     </td> |                     </td> | ||||||
|                     <td class="text"> |                     <td class="text"> | ||||||
|                         <span class="wrap"><a rel="nofollow" href="/{{$.Username}}/{{$.Reponame}}/commit/{{$commit.Id}}">{{$commit.Message}}</a></span> |                         <span class="wrap"><a rel="nofollow" href="/{{$.Username}}/{{$.Reponame}}/commit/{{$commit.Id}}">{{$commit.Summary}}</a></span> | ||||||
|                     </td> |                     </td> | ||||||
|                     <td class="date"> |                     <td class="date"> | ||||||
|                         <span class="wrap">{{TimeSince $commit.Committer.When}}</span> |                         <span class="wrap">{{TimeSince $commit.Committer.When}}</span> | ||||||
|  | |||||||
| @ -11,13 +11,13 @@ | |||||||
|         <div class="profile-info"> |         <div class="profile-info"> | ||||||
|             <ul class="list-group"> |             <ul class="list-group"> | ||||||
|                 {{if .Owner.Location}} |                 {{if .Owner.Location}} | ||||||
|                     <li class="list-group-item"><i class="fa fa-thumb-tack"></i>{{.Owner.Location}}</li> |                 <li class="list-group-item"><i class="fa fa-thumb-tack"></i>{{.Owner.Location}}</li> | ||||||
|                 {{end}} |                 {{end}} | ||||||
|                 {{if .Owner.Email}} |                 {{if .Owner.Email}} | ||||||
|                     <li class="list-group-item"><i class="fa fa-envelope"></i><a href="mailto:{{.Owner.Email}}">{{.Owner.Email}}</a></li> |                 <li class="list-group-item"><i class="fa fa-envelope"></i><a href="mailto:{{.Owner.Email}}" rel="nofollow">{{.Owner.Email}}</a></li> | ||||||
|                 {{end}} |                 {{end}} | ||||||
|                 {{if .Owner.Website}} |                 {{if .Owner.Website}} | ||||||
|                     <li class="list-group-item"><i class="fa fa-link"></i><a target="_blank" href="{{.Owner.Website}}">{{.Owner.Website}}</a></li> |                 <li class="list-group-item"><i class="fa fa-link"></i><a target="_blank" href="{{.Owner.Website}}">{{.Owner.Website}}</a></li> | ||||||
|                 {{end}} |                 {{end}} | ||||||
|                 <li class="list-group-item"><i class="fa fa-clock-o"></i>Joined on {{DateFormat .Owner.Created "M d, Y"}}</li> |                 <li class="list-group-item"><i class="fa fa-clock-o"></i>Joined on {{DateFormat .Owner.Created "M d, Y"}}</li> | ||||||
|                 <!-- <hr> --> |                 <!-- <hr> --> | ||||||
|  | |||||||
| @ -10,7 +10,7 @@ | |||||||
|         {{end}} |         {{end}} | ||||||
|         {{template "base/alert" .}} |         {{template "base/alert" .}} | ||||||
|         <div class="form-group {{if .Err_UserName}}has-error has-feedback{{end}}"> |         <div class="form-group {{if .Err_UserName}}has-error has-feedback{{end}}"> | ||||||
|             <label class="col-md-4 control-label">Username: </label> |             <label class="col-md-4 control-label">Username or e-mail: </label> | ||||||
|             <div class="col-md-6"> |             <div class="col-md-6"> | ||||||
|                 <input name="username" class="form-control" placeholder="Type your username" value="{{.username}}" required="required"> |                 <input name="username" class="form-control" placeholder="Type your username" value="{{.username}}" required="required"> | ||||||
|             </div> |             </div> | ||||||
|  | |||||||
| @ -1,9 +0,0 @@ | |||||||
| command: go test -v {} |  | ||||||
| include: ^.+_test\.go$ |  | ||||||
| path: ./ |  | ||||||
| depth: 1 |  | ||||||
| verbose: true |  | ||||||
| timeout: 1m |  | ||||||
| reload: false |  | ||||||
| html: test.html |  | ||||||
| notify: [] |  | ||||||
| @ -1,13 +0,0 @@ | |||||||
| ## Gogs Test |  | ||||||
| 
 |  | ||||||
| This is for developers. |  | ||||||
| 
 |  | ||||||
| ## Prepare Environment |  | ||||||
| 
 |  | ||||||
| 	go get -u github.com/shxsun/travelexec |  | ||||||
| 	# start gogs server |  | ||||||
| 	gogs web |  | ||||||
| 
 |  | ||||||
| ## Start Testing |  | ||||||
| 
 |  | ||||||
| 	travelexec |  | ||||||
| @ -1,17 +0,0 @@ | |||||||
| package test |  | ||||||
| 
 |  | ||||||
| import ( |  | ||||||
| 	"net/http" |  | ||||||
| 	"testing" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| func TestMain(t *testing.T) { |  | ||||||
| 	r, err := http.Get("http://localhost:3000/") |  | ||||||
| 	if err != nil { |  | ||||||
| 		t.Fatal(err) |  | ||||||
| 	} |  | ||||||
| 	defer r.Body.Close() |  | ||||||
| 	if r.StatusCode != http.StatusOK { |  | ||||||
| 		t.Error(r.StatusCode) |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user