## Features
- Activity timeline
-- SSH/HTTPS protocol support.
+- SSH/HTTPS(Clone only) protocol support.
- Register/delete account.
- Create/delete/watch public repository.
- User profile page.
## 功能特性
- 活动时间线
-- SSH/HTTPS 协议支持
+- SSH/HTTPS(仅限 Clone) 协议支持
- 注册/删除用户
- 创建/删除/关注公开仓库
- 用户个人信息页面
// Test that go1.2 tag above is included in builds. main.go refers to this definition.
const go12tag = true
-const APP_VER = "0.1.8.0326 Alpha"
+const APP_VER = "0.1.8.0327 Alpha"
func init() {
base.AppVer = APP_VER
AU_WRITABLE
)
-// Access represents the accessibility of user and repository.
+// Access represents the accessibility of user to repository.
type Access struct {
Id int64
UserName string `xorm:"unique(s)"`
return err
}
-// HasAccess returns true if someone can read or write given repository.
+// HasAccess returns true if someone can read or write to given repository.
func HasAccess(userName, repoName string, mode int) (bool, error) {
return orm.Get(&Access{
Id: 0,
OP_PULL_REQUEST
)
-// Action represents user operation type and information to the repository.
+// Action represents user operation type and other information to repository.,
+// it implemented interface base.Actioner so that can be used in template render.
type Action struct {
Id int64
UserId int64 // Receiver user id.
return a.Content
}
-// CommitRepoAction records action for commit repository.
+// CommitRepoAction adds new action for committing repository.
func CommitRepoAction(userId int64, userName string,
repoId int64, repoName string, refName string, commits *base.PushCommits) error {
log.Trace("action.CommitRepoAction(start): %d/%s", userId, repoName)
return err
}
- if err = NotifyWatchers(userId, repoId, OP_COMMIT_REPO, userName, repoName, refName, string(bs)); err != nil {
+ if err = NotifyWatchers(&Action{ActUserId: userId, ActUserName: userName, OpType: OP_COMMIT_REPO,
+ Content: string(bs), RepoId: repoId, RepoName: repoName, RefName: refName}); err != nil {
log.Error("action.CommitRepoAction(notify watchers): %d/%s", userId, repoName)
return err
}
- // Update repository last update time.
+ // Change repository bare status and update last updated time.
repo, err := GetRepositoryByName(userId, repoName)
if err != nil {
log.Error("action.CommitRepoAction(GetRepositoryByName): %d/%s", userId, repoName)
}
// NotifyWatchers creates batch of actions for every watcher.
-func NotifyWatchers(userId, repoId int64, opType int, userName, repoName, refName, content string) error {
+func NotifyWatchers(act *Action) error {
// Add feeds for user self and all watchers.
- watches, err := GetWatches(repoId)
+ watches, err := GetWatches(act.RepoId)
if err != nil {
return errors.New("repo.NotifyWatchers(get watches): " + err.Error())
}
- watches = append(watches, Watch{UserId: userId})
+ watches = append(watches, Watch{UserId: act.ActUserId})
for i := range watches {
- if userId == watches[i].UserId && i > 0 {
+ if act.ActUserId == watches[i].UserId && i > 0 {
continue // Do not add twice in case author watches his/her repository.
}
- _, err = orm.InsertOne(&Action{
- UserId: watches[i].UserId,
- ActUserId: userId,
- ActUserName: userName,
- OpType: opType,
- Content: content,
- RepoId: repoId,
- RepoName: repoName,
- RefName: refName,
- })
- if err != nil {
+ act.UserId = watches[i].UserId
+ if _, err = orm.InsertOne(act); err != nil {
return errors.New("repo.NotifyWatchers(create action): " + err.Error())
}
}
}
// Notify watchers.
- if err = models.NotifyWatchers(ctx.User.Id, ctx.Repo.Repository.Id, models.OP_CREATE_ISSUE,
- ctx.User.Name, ctx.Repo.Repository.Name, "", fmt.Sprintf("%d|%s", issue.Index, issue.Name)); err != nil {
+ if err = models.NotifyWatchers(&models.Action{ActUserId: ctx.User.Id, ActUserName: ctx.User.Name,
+ OpType: models.OP_CREATE_ISSUE, Content: fmt.Sprintf("%d|%s", issue.Index, issue.Name),
+ RepoId: ctx.Repo.Repository.Id, RepoName: ctx.Repo.Repository.Name, RefName: ""}); err != nil {
ctx.Handle(200, "issue.CreateIssue", err)
return
}
return
}
issue.Poster = u
+ issue.Content = string(base.RenderMarkdown([]byte(issue.Content), ""))
// Get comments.
comments, err := models.GetIssueComments(issue.Id)
return
}
comments[i].Poster = u
+ comments[i].Content = string(base.RenderMarkdown([]byte(comments[i].Content), ""))
}
ctx.Data["Title"] = issue.Name
<div class="issue-main">
<div class="panel panel-default issue-content">
<div class="panel-body markdown">
- <p>{{.Issue.Content}}</p>
+ {{str2html .Issue.Content}}
</div>
</div>
{{range .Comments}}
<a href="/user/{{.Poster.Name}}" class="user">{{.Poster.Name}}</a> commented <span class="time">{{TimeSince .Created}}</span>
</div>
<div class="panel-body markdown">
- <p>{{.Content}}</p>
+ {{str2html .Content}}
</div>
</div>
</div>
r.Any("/:userid/delete", admin.DeleteUser)
}, adminReq)
+ if martini.Env == martini.Dev {
+ m.Get("/template/**", dev.TemplatePreview)
+ }
+
m.Group("/:username/:reponame", func(r martini.Router) {
r.Post("/settings", repo.SettingPost)
r.Get("/settings", repo.Setting)
r.Any("/:reponame/**", repo.Http)
}, ignSignIn)
- if martini.Env == martini.Dev {
- m.Get("/template/**", dev.TemplatePreview)
- }
-
// Not found handler.
m.NotFound(routers.NotFound)