You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

преди 10 години
преди 10 години
преди 10 години
преди 10 години
преди 10 години
преди 10 години
преди 10 години
преди 10 години
преди 10 години
преди 10 години
преди 10 години
преди 10 години
преди 10 години
преди 10 години
преди 10 години
преди 10 години
преди 10 години
преди 10 години
преди 10 години
преди 10 години
преди 10 години
преди 10 години
преди 10 години
преди 10 години
преди 10 години
преди 10 години
преди 10 години
преди 10 години
преди 10 години
преди 10 години
преди 10 години
преди 10 години
преди 10 години
преди 10 години
преди 10 години
преди 10 години
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362
  1. // Copyright 2014 The Gogs Authors. All rights reserved.
  2. // Use of this source code is governed by a MIT-style
  3. // license that can be found in the LICENSE file.
  4. package repo
  5. import (
  6. "path"
  7. "strings"
  8. "github.com/codegangsta/martini"
  9. "github.com/gogits/git"
  10. "github.com/gogits/webdav"
  11. "github.com/gogits/gogs/models"
  12. "github.com/gogits/gogs/modules/auth"
  13. "github.com/gogits/gogs/modules/base"
  14. "github.com/gogits/gogs/modules/log"
  15. "github.com/gogits/gogs/modules/middleware"
  16. )
  17. func Create(ctx *middleware.Context, form auth.CreateRepoForm) {
  18. ctx.Data["Title"] = "Create repository"
  19. ctx.Data["PageIsNewRepo"] = true // For navbar arrow.
  20. ctx.Data["LanguageIgns"] = models.LanguageIgns
  21. ctx.Data["Licenses"] = models.Licenses
  22. if ctx.Req.Method == "GET" {
  23. ctx.HTML(200, "repo/create")
  24. return
  25. }
  26. if ctx.HasError() {
  27. ctx.HTML(200, "repo/create")
  28. return
  29. }
  30. _, err := models.CreateRepository(ctx.User, form.RepoName, form.Description,
  31. form.Language, form.License, form.Visibility == "private", form.InitReadme == "on")
  32. if err == nil {
  33. log.Trace("%s Repository created: %s/%s", ctx.Req.RequestURI, ctx.User.LowerName, form.RepoName)
  34. ctx.Redirect("/"+ctx.User.Name+"/"+form.RepoName, 302)
  35. return
  36. } else if err == models.ErrRepoAlreadyExist {
  37. ctx.RenderWithErr("Repository name has already been used", "repo/create", &form)
  38. return
  39. } else if err == models.ErrRepoNameIllegal {
  40. ctx.RenderWithErr(models.ErrRepoNameIllegal.Error(), "repo/create", &form)
  41. return
  42. }
  43. ctx.Handle(200, "repo.Create", err)
  44. }
  45. func SettingPost(ctx *middleware.Context) {
  46. if !ctx.Repo.IsOwner {
  47. ctx.Error(404)
  48. return
  49. }
  50. switch ctx.Query("action") {
  51. case "delete":
  52. if len(ctx.Repo.Repository.Name) == 0 || ctx.Repo.Repository.Name != ctx.Query("repository") {
  53. ctx.Data["ErrorMsg"] = "Please make sure you entered repository name is correct."
  54. ctx.HTML(200, "repo/setting")
  55. return
  56. }
  57. if err := models.DeleteRepository(ctx.User.Id, ctx.Repo.Repository.Id, ctx.User.LowerName); err != nil {
  58. ctx.Handle(200, "repo.Delete", err)
  59. return
  60. }
  61. }
  62. log.Trace("%s Repository deleted: %s/%s", ctx.Req.RequestURI, ctx.User.LowerName, ctx.Repo.Repository.LowerName)
  63. ctx.Redirect("/", 302)
  64. }
  65. func Branches(ctx *middleware.Context, params martini.Params) {
  66. if !ctx.Repo.IsValid {
  67. return
  68. }
  69. brs, err := models.GetBranches(params["username"], params["reponame"])
  70. if err != nil {
  71. ctx.Handle(200, "repo.Branches", err)
  72. return
  73. } else if len(brs) == 0 {
  74. ctx.Error(404)
  75. return
  76. }
  77. ctx.Data["Username"] = params["username"]
  78. ctx.Data["Reponame"] = params["reponame"]
  79. ctx.Data["Branchname"] = brs[0]
  80. ctx.Data["Branches"] = brs
  81. ctx.Data["IsRepoToolbarBranches"] = true
  82. ctx.HTML(200, "repo/branches")
  83. }
  84. func Single(ctx *middleware.Context, params martini.Params) {
  85. if !ctx.Repo.IsValid {
  86. return
  87. }
  88. if len(params["branchname"]) == 0 {
  89. params["branchname"] = "master"
  90. }
  91. // Get tree path
  92. treename := params["_1"]
  93. if len(treename) > 0 && treename[len(treename)-1] == '/' {
  94. ctx.Redirect("/"+ctx.Repo.Owner.LowerName+"/"+
  95. ctx.Repo.Repository.Name+"/src/"+params["branchname"]+"/"+treename[:len(treename)-1], 302)
  96. return
  97. }
  98. ctx.Data["IsRepoToolbarSource"] = true
  99. // Branches.
  100. brs, err := models.GetBranches(params["username"], params["reponame"])
  101. if err != nil {
  102. log.Error("repo.Single(GetBranches): %v", err)
  103. ctx.Error(404)
  104. return
  105. } else if ctx.Repo.Repository.IsBare {
  106. ctx.Data["IsBareRepo"] = true
  107. ctx.HTML(200, "repo/single")
  108. return
  109. }
  110. ctx.Data["Branches"] = brs
  111. repoFile, err := models.GetTargetFile(params["username"], params["reponame"],
  112. params["branchname"], params["commitid"], treename)
  113. if err != nil && err != models.ErrRepoFileNotExist {
  114. log.Error("repo.Single(GetTargetFile): %v", err)
  115. ctx.Error(404)
  116. return
  117. }
  118. branchLink := "/" + ctx.Repo.Owner.LowerName + "/" + ctx.Repo.Repository.Name + "/src/" + params["branchname"]
  119. if len(treename) != 0 && repoFile == nil {
  120. ctx.Error(404)
  121. return
  122. }
  123. if repoFile != nil && repoFile.IsFile() {
  124. if repoFile.Size > 1024*1024 || repoFile.Filemode != git.FileModeBlob {
  125. ctx.Data["FileIsLarge"] = true
  126. } else if blob, err := repoFile.LookupBlob(); err != nil {
  127. log.Error("repo.Single(repoFile.LookupBlob): %v", err)
  128. ctx.Error(404)
  129. } else {
  130. ctx.Data["IsFile"] = true
  131. ctx.Data["FileName"] = repoFile.Name
  132. ext := path.Ext(repoFile.Name)
  133. if len(ext) > 0 {
  134. ext = ext[1:]
  135. }
  136. ctx.Data["FileExt"] = ext
  137. readmeExist := base.IsMarkdownFile(repoFile.Name) || base.IsReadmeFile(repoFile.Name)
  138. ctx.Data["ReadmeExist"] = readmeExist
  139. if readmeExist {
  140. ctx.Data["FileContent"] = string(base.RenderMarkdown(blob.Contents(), ""))
  141. } else {
  142. ctx.Data["FileContent"] = string(blob.Contents())
  143. }
  144. }
  145. } else {
  146. // Directory and file list.
  147. files, err := models.GetReposFiles(params["username"], params["reponame"],
  148. params["branchname"], params["commitid"], treename)
  149. if err != nil {
  150. log.Error("repo.Single(GetReposFiles): %v", err)
  151. ctx.Error(404)
  152. return
  153. }
  154. ctx.Data["Files"] = files
  155. var readmeFile *models.RepoFile
  156. for _, f := range files {
  157. if !f.IsFile() || !base.IsReadmeFile(f.Name) {
  158. continue
  159. } else {
  160. readmeFile = f
  161. break
  162. }
  163. }
  164. if readmeFile != nil {
  165. ctx.Data["ReadmeExist"] = true
  166. // if file large than 1M not show it
  167. if readmeFile.Size > 1024*1024 || readmeFile.Filemode != git.FileModeBlob {
  168. ctx.Data["FileIsLarge"] = true
  169. } else if blob, err := readmeFile.LookupBlob(); err != nil {
  170. log.Error("repo.Single(readmeFile.LookupBlob): %v", err)
  171. ctx.Error(404)
  172. return
  173. } else {
  174. // current repo branch link
  175. ctx.Data["FileName"] = readmeFile.Name
  176. ctx.Data["FileContent"] = string(base.RenderMarkdown(blob.Contents(), branchLink))
  177. }
  178. }
  179. }
  180. ctx.Data["Username"] = params["username"]
  181. ctx.Data["Reponame"] = params["reponame"]
  182. ctx.Data["Branchname"] = params["branchname"]
  183. var treenames []string
  184. Paths := make([]string, 0)
  185. if len(treename) > 0 {
  186. treenames = strings.Split(treename, "/")
  187. for i, _ := range treenames {
  188. Paths = append(Paths, strings.Join(treenames[0:i+1], "/"))
  189. }
  190. ctx.Data["HasParentPath"] = true
  191. if len(Paths)-2 >= 0 {
  192. ctx.Data["ParentPath"] = "/" + Paths[len(Paths)-2]
  193. }
  194. }
  195. // Get latest commit according username and repo name
  196. commit, err := models.GetCommit(params["username"], params["reponame"],
  197. params["branchname"], params["commitid"])
  198. if err != nil {
  199. log.Error("repo.Single(GetCommit): %v", err)
  200. ctx.Error(404)
  201. return
  202. }
  203. ctx.Data["LastCommit"] = commit
  204. ctx.Data["Paths"] = Paths
  205. ctx.Data["Treenames"] = treenames
  206. ctx.Data["BranchLink"] = branchLink
  207. ctx.HTML(200, "repo/single")
  208. }
  209. func Http(ctx *middleware.Context, params martini.Params) {
  210. /*if !ctx.Repo.IsValid {
  211. return
  212. }*/
  213. // TODO: access check
  214. username := params["username"]
  215. reponame := params["reponame"]
  216. if strings.HasSuffix(reponame, ".git") {
  217. reponame = reponame[:len(reponame)-4]
  218. }
  219. prefix := path.Join("/", username, params["reponame"])
  220. server := &webdav.Server{
  221. Fs: webdav.Dir(models.RepoPath(username, reponame)),
  222. TrimPrefix: prefix,
  223. Listings: true,
  224. }
  225. server.ServeHTTP(ctx.ResponseWriter, ctx.Req)
  226. }
  227. func Setting(ctx *middleware.Context, params martini.Params) {
  228. if !ctx.Repo.IsOwner {
  229. ctx.Error(404)
  230. return
  231. }
  232. ctx.Data["IsRepoToolbarSetting"] = true
  233. if ctx.Repo.Repository.IsBare {
  234. ctx.Data["IsBareRepo"] = true
  235. ctx.HTML(200, "repo/setting")
  236. return
  237. }
  238. var title string
  239. if t, ok := ctx.Data["Title"].(string); ok {
  240. title = t
  241. }
  242. if len(params["branchname"]) == 0 {
  243. params["branchname"] = "master"
  244. }
  245. ctx.Data["Branchname"] = params["branchname"]
  246. ctx.Data["Title"] = title + " - settings"
  247. ctx.HTML(200, "repo/setting")
  248. }
  249. func Commits(ctx *middleware.Context, params martini.Params) {
  250. brs, err := models.GetBranches(params["username"], params["reponame"])
  251. if err != nil {
  252. ctx.Handle(200, "repo.Commits", err)
  253. return
  254. } else if len(brs) == 0 {
  255. ctx.Error(404)
  256. return
  257. }
  258. ctx.Data["IsRepoToolbarCommits"] = true
  259. commits, err := models.GetCommits(params["username"],
  260. params["reponame"], params["branchname"])
  261. if err != nil {
  262. ctx.Error(404)
  263. return
  264. }
  265. ctx.Data["Username"] = params["username"]
  266. ctx.Data["Reponame"] = params["reponame"]
  267. ctx.Data["CommitCount"] = commits.Len()
  268. ctx.Data["Commits"] = commits
  269. ctx.HTML(200, "repo/commits")
  270. }
  271. func Pulls(ctx *middleware.Context) {
  272. ctx.Data["IsRepoToolbarPulls"] = true
  273. ctx.HTML(200, "repo/pulls")
  274. }
  275. func Action(ctx *middleware.Context, params martini.Params) {
  276. var err error
  277. switch params["action"] {
  278. case "watch":
  279. err = models.WatchRepo(ctx.User.Id, ctx.Repo.Repository.Id, true)
  280. case "unwatch":
  281. err = models.WatchRepo(ctx.User.Id, ctx.Repo.Repository.Id, false)
  282. case "desc":
  283. if !ctx.Repo.IsOwner {
  284. ctx.Error(404)
  285. return
  286. }
  287. ctx.Repo.Repository.Description = ctx.Query("desc")
  288. ctx.Repo.Repository.Website = ctx.Query("site")
  289. err = models.UpdateRepository(ctx.Repo.Repository)
  290. }
  291. if err != nil {
  292. log.Error("repo.Action(%s): %v", params["action"], err)
  293. ctx.JSON(200, map[string]interface{}{
  294. "ok": false,
  295. "err": err.Error(),
  296. })
  297. return
  298. }
  299. ctx.JSON(200, map[string]interface{}{
  300. "ok": true,
  301. })
  302. }