diff --git a/conf/app.ini b/conf/app.ini index fb425d81c..fcfbe9bc2 100644 --- a/conf/app.ini +++ b/conf/app.ini @@ -3,6 +3,8 @@ RUN_USER = lunny [repository] ROOT = /Users/lunny/git/gogs-repositories +LANG_IGNS=Google Go +LICENSES=Apache v2 License [server] HTTP_ADDR = diff --git a/conf/gitignore/Google Go b/conf/gitignore/Google Go new file mode 100644 index 000000000..6cd1df2b7 --- /dev/null +++ b/conf/gitignore/Google Go @@ -0,0 +1,22 @@ +# Compiled Object files, Static and Dynamic libs (Shared Objects) +*.o +*.a +*.so + +# Folders +_obj +_test + +# Architecture specific extensions/prefixes +*.[568vq] +[568vq].out + +*.cgo1.go +*.cgo2.c +_cgo_defun.c +_cgo_gotypes.go +_cgo_export.* + +_testmain.go + +*.exe \ No newline at end of file diff --git a/conf/license/Apache v2 License b/conf/license/Apache v2 License new file mode 100644 index 000000000..ad410e113 --- /dev/null +++ b/conf/license/Apache v2 License @@ -0,0 +1,201 @@ +Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file diff --git a/gogs.go b/gogs.go index 1ea903263..0bdf74d72 100644 --- a/gogs.go +++ b/gogs.go @@ -20,7 +20,7 @@ import ( // Test that go1.1 tag above is included in builds. main.go refers to this definition. const go11tag = true -const APP_VER = "0.0.3.0311" +const APP_VER = "0.0.4.0311" func init() { runtime.GOMAXPROCS(runtime.NumCPU()) diff --git a/models/models.go b/models/models.go index 056682475..ce95c1256 100644 --- a/models/models.go +++ b/models/models.go @@ -70,8 +70,6 @@ func setEngine() { orm.Logger = f orm.ShowSQL = true - //log.Trace("Initialized database -> %s", dbName) - RepoRootPath = base.Cfg.MustValue("repository", "ROOT") } diff --git a/models/repo.go b/models/repo.go index 308d5f3be..ed828a347 100644 --- a/models/repo.go +++ b/models/repo.go @@ -14,8 +14,10 @@ import ( "time" "unicode/utf8" + "github.com/Unknwon/com" git "github.com/libgit2/git2go" + "github.com/gogits/gogs/modules/base" "github.com/gogits/gogs/modules/log" ) @@ -41,10 +43,19 @@ type Star struct { Created time.Time `xorm:"created"` } +var ( + LanguageIgns, Licenses []string +) + var ( ErrRepoAlreadyExist = errors.New("Repository already exist") ) +func init() { + LanguageIgns = strings.Split(base.Cfg.MustValue("repository", "LANG_IGNS"), "|") + Licenses = strings.Split(base.Cfg.MustValue("repository", "LICENSES"), "|") +} + // check if repository is exist func IsRepositoryExist(user *User, repoName string) (bool, error) { repo := Repository{OwnerId: user.Id} @@ -60,7 +71,7 @@ func IsRepositoryExist(user *User, repoName string) (bool, error) { } // CreateRepository creates a repository for given user or orgnaziation. -func CreateRepository(user *User, repoName, desc, repoLang string, private bool, initReadme bool) (*Repository, error) { +func CreateRepository(user *User, repoName, desc, repoLang, license string, private bool, initReadme bool) (*Repository, error) { isExist, err := IsRepositoryExist(user, repoName) if err != nil { return nil, err @@ -77,7 +88,7 @@ func CreateRepository(user *User, repoName, desc, repoLang string, private bool, } f := RepoPath(user.Name, repoName) - if err = initRepository(f, user, repo, initReadme, repoLang); err != nil { + if err = initRepository(f, user, repo, initReadme, repoLang, license); err != nil { return nil, err } session := orm.NewSession() @@ -129,12 +140,14 @@ func CreateRepository(user *User, repoName, desc, repoLang string, private bool, } // InitRepository initializes README and .gitignore if needed. -func initRepository(f string, user *User, repo *Repository, initReadme bool, repoLang string) error { +func initRepository(f string, user *User, repo *Repository, initReadme bool, repoLang, license string) error { fileName := map[string]string{ - "readme": "README.md", - "gitign": ".gitignore", + "readme": "README.md", + "gitign": ".gitignore", + "license": "LICENSE", } workdir := os.TempDir() + fmt.Sprintf("%d", time.Now().Nanosecond()) + os.MkdirAll(workdir, os.ModePerm) sig := &git.Signature{ Name: user.Name, @@ -151,12 +164,22 @@ func initRepository(f string, user *User, repo *Repository, initReadme bool, rep } // .gitignore - // if err := ioutil.WriteFile(filepath.Join(workdir, gitIgn), - // []byte(defaultREADME), 0644); err != nil { - // return err - // } + filePath := "conf/gitignore/" + repoLang + if com.IsFile(filePath) { + if _, err := com.Copy(filePath, + filepath.Join(workdir, fileName["gitign"])); err != nil { + return err + } + } // LICENSE + filePath = "conf/license/" + license + if com.IsFile(filePath) { + if _, err := com.Copy(filePath, + filepath.Join(workdir, fileName["license"])); err != nil { + return err + } + } rp, err := git.InitRepository(f, true) if err != nil { @@ -169,8 +192,10 @@ func initRepository(f string, user *User, repo *Repository, initReadme bool, rep return err } - if err = idx.AddByPath(fileName["readme"]); err != nil { - return err + for _, name := range fileName { + if err = idx.AddByPath(name); err != nil { + return err + } } treeId, err := idx.WriteTree() diff --git a/modules/auth/repo.go b/modules/auth/repo.go index e55ccb289..981315d40 100644 --- a/modules/auth/repo.go +++ b/modules/auth/repo.go @@ -22,6 +22,7 @@ type CreateRepoForm struct { Visibility string `form:"visibility"` Description string `form:"desc" binding:"MaxSize(100)"` Language string `form:"language"` + License string `form:"license"` InitReadme string `form:"initReadme"` } diff --git a/routers/repo/repo.go b/routers/repo/repo.go index 221d4ba1f..62352f76c 100644 --- a/routers/repo/repo.go +++ b/routers/repo/repo.go @@ -21,6 +21,8 @@ func Create(form auth.CreateRepoForm, req *http.Request, r render.Render, data b data["Title"] = "Create repository" if req.Method == "GET" { + data["LanguageIgns"] = models.LanguageIgns + data["Licenses"] = models.Licenses r.HTML(200, "repo/create", data) return } @@ -45,7 +47,7 @@ func Create(form auth.CreateRepoForm, req *http.Request, r render.Render, data b if err == nil { if _, err = models.CreateRepository(user, - form.RepoName, form.Description, form.Language, + form.RepoName, form.Description, form.Language, form.License, form.Visibility == "private", form.InitReadme == "true"); err == nil { if err == nil { data["RepoName"] = user.Name + "/" + form.RepoName diff --git a/serve.go b/serve.go index 8ef5690b9..2b736c2f4 100644 --- a/serve.go +++ b/serve.go @@ -123,7 +123,7 @@ func runServ(*cli.Context) { println("Repository", user.Name+"/"+repoName, "is not exist") return } else if isWrite { - _, err := models.CreateRepository(user, repoName, "", "", false, true) + _, err := models.CreateRepository(user, repoName, "", "", "", false, true) if err != nil { println("Create repository failed") return diff --git a/templates/repo/create.tmpl b/templates/repo/create.tmpl index d8267d7bd..93d33c874 100644 --- a/templates/repo/create.tmpl +++ b/templates/repo/create.tmpl @@ -40,11 +40,7 @@