| @@ -0,0 +1,162 @@ | |||||
| # Contribution Guidelines | |||||
| ## Introduction | |||||
| This document explains how to contribute changes to the Gitea | |||||
| project. It assumes you have followed the [installation | |||||
| instructions](https://github.com/go-gitea/docs/tree/master/en-US/installation) | |||||
| Sensitive security-related issues should be reported to | |||||
| [security@gitea.io](mailto:security@gitea.io). | |||||
| ## Bug reports | |||||
| Please search the issues on the issue tracker with a variety of keywords | |||||
| to ensure your bug is not already reported. | |||||
| If unique, [open an issue](https://github.com/go-gitea/gitea/issues/new) | |||||
| and answer the questions so we can understand and reproduce the | |||||
| problematic behavior. | |||||
| The burden is on you to convince us that it is actually a bug | |||||
| in Gitea. This is easiest to do when you write clear, concise | |||||
| instructions so we can reproduce the behavior (even if it seems | |||||
| obvious). The more detailed and specific you are, the faster | |||||
| we will be able to help you. Check out [How to Report Bugs | |||||
| Effectively](http://www.chiark.greenend.org.uk/~sgtatham/bugs.html). | |||||
| Please be kind, remember that Gitea comes at no cost to you, and you're | |||||
| getting free help. | |||||
| ## Discuss your design | |||||
| The project welcomes submissions but please let everyone know what | |||||
| you're working on if you want to change or add something to the Gitea | |||||
| repositories. | |||||
| Before starting to write something new for the Gitea project, please | |||||
| [file an issue](https://github.com/go-gitea/gitea/issues/new). | |||||
| Significant changes must go through the [change proposal | |||||
| process](https://github.com/go-gitea/proposals) before they can be | |||||
| accepted. | |||||
| This process gives everyone a chance to validate the design, helps | |||||
| prevent duplication of effort, and ensures that the idea fits inside | |||||
| the goals for the project and tools. It also checks that the design is | |||||
| sound before code is written; the code review tool is not the place for | |||||
| high-level discussions. | |||||
| ## Testing redux | |||||
| Before sending code out for review, run all the tests for the whole | |||||
| tree to make sure the changes don't break other usage and keep the | |||||
| compatibility on upgrade: | |||||
| After running for a while, the command should print | |||||
| ``` | |||||
| ALL TESTS PASSED | |||||
| ``` | |||||
| ## Code review | |||||
| Changes to Gitea must be reviewed before they are accepted, no matter | |||||
| who makes the change even if an owners or a maintainer. We use github's | |||||
| pull request workflow to do that and use [lgtm](http://lgtm.co) to ensure | |||||
| every PR is reviewed by at least 2 maintainers. | |||||
| ## Sign your work | |||||
| The sign-off is a simple line at the end of the explanation for the | |||||
| patch. Your signature certifies that you wrote the patch or otherwise | |||||
| have the right to pass it on as an open-source patch. The rules are | |||||
| pretty simple: If you can certify [DCO](DCO), then you just add a line | |||||
| to every git commit message: | |||||
| ``` | |||||
| Signed-off-by: Joe Smith <joe.smith@email.com> | |||||
| ``` | |||||
| Please use your real name, we really dislike pseudonyms or anonymous | |||||
| contributions. We are in the opensource world without secrets. If you | |||||
| set your `user.name` and `user.email` git configs, you can sign your | |||||
| commit automatically with `git commit -s`. | |||||
| ## Contributors | |||||
| Everyone who sent a PR to Gitea that gets accepted will | |||||
| be as a contributor. Please send a PR to add your name to | |||||
| [CONTRIBUTORS](CONTRIBUTORS). For the format, see the | |||||
| [CONTRIBUTORS](CONTRIBUTORS). | |||||
| ## Maintainers | |||||
| To make sure every PR have been checked, we make a team maintainers. Any | |||||
| PR MUST be reviewed and by at least two maintainers before it can | |||||
| get merged. Maintainers should be a contributor of gitea(or gogs) and | |||||
| contributed at least 4 accepted PRs. And a contributor should apply as a | |||||
| maintainer in [gitter Gitea develop](https://gitter.im/go-gitea/develop). | |||||
| And the owners or the team maintainer could invite the contributor. A | |||||
| maintainer should spend some time on code reviews. If some maintainer | |||||
| have no time to do that, he should apply to leave maintainers team and | |||||
| we will give him an honor to be as a member of advisor team. Of course, | |||||
| if an advisor have time to code view, welcome it back to maintainers team. | |||||
| If some one have no time to code view and forget to leave the maintainers, | |||||
| the owners have the power to move him from maintainers team to advisors | |||||
| team. | |||||
| ## Owners | |||||
| Since Gitea is a pure community organization without any company | |||||
| support, to keep the development healthly We will elect the owners every | |||||
| year. Every time we will elect three owners. All the contributers could | |||||
| vote for three owners, one is the main owner, the other two are assistant | |||||
| owners. When the new owners have been elected, the old owners MUST move | |||||
| the power to the new owners. If some owner don't obey these rules, | |||||
| the other owners are allowed to revoke his owner status. | |||||
| After the election, the new owners should say he agrees with these | |||||
| rules on the [CONTRIBUTING](CONTRIBUTING.md) on the [Gitter Gitea | |||||
| Channel](https://gitter.im/go-gitea/gitea). Below is the word to speak | |||||
| ``` | |||||
| I'm glad to be an owner of Gitea, | |||||
| I agree with [CONTRIBUTING](CONTRIBUTING.md). | |||||
| I will spend part of my time on gitea | |||||
| and lead the development of gitea. | |||||
| ``` | |||||
| For a honor to the owners, this document will add the history owners | |||||
| below: | |||||
| 2016-11-04 ~ 2017-12-31 | |||||
| - lunny <xiaolunwen@gmail.com> | |||||
| - tboerger <thomas@webhippie.de> | |||||
| - bkcsoft <kim.carlbacker@gmail.com> | |||||
| ## Versions | |||||
| Gitea has one master as a tip branch and have many version branch | |||||
| such as v0.9. v0.9 is a release branch and we will tag v0.9.0 both for | |||||
| binary download. If v0.9.0 have some bugs, we will accept PR on v0.9 | |||||
| and publish v0.9.1 and merge bug PR to master. | |||||
| Branch master is a tip version, so if you wish a production usage, | |||||
| please download the latest release tag version. All the branch will be | |||||
| protected via github, All the PRs to all the branches should be review | |||||
| by two maintainers and pass the automatic tests. | |||||
| ## Copyright | |||||
| Code that you contribute should use the standard copyright header: | |||||
| ``` | |||||
| // Copyright 2016 - 2017 The Gitea Authors. All rights reserved. | |||||
| // Use of this source code is governed by a MIT-style | |||||
| // license that can be found in the LICENSE file. | |||||
| ``` | |||||
| Files in the repository are copyright the year they are added and the | |||||
| year they are last changed. If the copyright author is changed, just | |||||
| copy the head below the old one. | |||||
| @@ -0,0 +1,9 @@ | |||||
| Andrey Nering <nobody@nobody.tld> (@andreynering) | |||||
| Kim Carlbäcker <kim.carlbacker@gmail.com> (@bkcsoft) | |||||
| LefsFlare <nobody@nobody.tld> (@LefsFlarey) | |||||
| Lunny Xiao <xiaolunwen@gmail.com> (@lunny) | |||||
| Rachid Zarouali <nobody@nobody.tld> (@xinity) | |||||
| Rémy Boulanouar <admin@dblk.org> (@DblK) | |||||
| Sandro Santilli <strk@kbt.io> (@strk) | |||||
| Thibault Meyer <nobody@nobody.tld> (@0xbaadf00d) | |||||
| Thomas Boerger <thomas@webhippie.de> (@tboerger) | |||||
| @@ -0,0 +1,36 @@ | |||||
| Developer Certificate of Origin | |||||
| Version 1.1 | |||||
| Copyright (C) 2004, 2006 The Linux Foundation and its contributors. | |||||
| 660 York Street, Suite 102, | |||||
| San Francisco, CA 94110 USA | |||||
| Everyone is permitted to copy and distribute verbatim copies of this | |||||
| license document, but changing it is not allowed. | |||||
| Developer's Certificate of Origin 1.1 | |||||
| By making a contribution to this project, I certify that: | |||||
| (a) The contribution was created in whole or in part by me and I | |||||
| have the right to submit it under the open source license | |||||
| indicated in the file; or | |||||
| (b) The contribution is based upon previous work that, to the best | |||||
| of my knowledge, is covered under an appropriate open source | |||||
| license and I have the right under that license to submit that | |||||
| work with modifications, whether created in whole or in part | |||||
| by me, under the same open source license (unless I am | |||||
| permitted to submit under a different license), as indicated | |||||
| in the file; or | |||||
| (c) The contribution was provided directly to me by some other | |||||
| person who certified (a), (b) or (c) and I have not modified | |||||
| it. | |||||
| (d) I understand and agree that this project and the contribution | |||||
| are public and that a record of the contribution (including all | |||||
| personal information I submit with it, including my sign-off) is | |||||
| maintained indefinitely and may be redistributed consistent with | |||||
| this project or the open source license(s) involved. | |||||
| @@ -1,4 +1,5 @@ | |||||
| Copyright (c) 2015 All Gogs Contributors | |||||
| Copyright (c) 2016 The Gitea Authors | |||||
| Copyright (c) 2014 The Gogs Authors | |||||
| Permission is hereby granted, free of charge, to any person obtaining a copy | Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
| of this software and associated documentation files (the "Software"), to deal | of this software and associated documentation files (the "Software"), to deal | ||||
| @@ -16,4 +17,4 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |||||
| AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
| LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
| OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
| THE SOFTWARE. | |||||
| THE SOFTWARE. | |||||
| @@ -0,0 +1,10 @@ | |||||
| Andrey Nering <nobody@nobody.tld> (@andreynering) | |||||
| Kim Carlbäcker <kim.carlbacker@gmail.com> (@bkcsoft) | |||||
| LefsFlare <nobody@nobody.tld> (@LefsFlarey) | |||||
| Lunny Xiao <xiaolunwen@gmail.com> (@lunny) | |||||
| Matthias Loibl <mail@matthiasloibl.com> (@metalmatze) | |||||
| Rachid Zarouali <nobody@nobody.tld> (@xinity) | |||||
| Rémy Boulanouar <admin@dblk.org> (@DblK) | |||||
| Sandro Santilli <strk@kbt.io> (@strk) | |||||
| Thibault Meyer <nobody@nobody.tld> (@0xbaadf00d) | |||||
| Thomas Boerger <thomas@webhippie.de> (@tboerger) | |||||
| @@ -0,0 +1,40 @@ | |||||
| IMPORT := code.gitea.io/git | |||||
| PACKAGES ?= $(shell go list ./... | grep -v /vendor/) | |||||
| GENERATE ?= code.gitea.io/git | |||||
| .PHONY: all | |||||
| all: clean test build | |||||
| .PHONY: clean | |||||
| clean: | |||||
| go clean -i ./... | |||||
| generate: | |||||
| @which mockery > /dev/null; if [ $$? -ne 0 ]; then \ | |||||
| go get -u github.com/vektra/mockery/...; \ | |||||
| fi | |||||
| go generate $(GENERATE) | |||||
| .PHONY: fmt | |||||
| fmt: | |||||
| go fmt $(PACKAGES) | |||||
| .PHONY: vet | |||||
| vet: | |||||
| go vet $(PACKAGES) | |||||
| .PHONY: lint | |||||
| lint: | |||||
| @which golint > /dev/null; if [ $$? -ne 0 ]; then \ | |||||
| go get -u github.com/golang/lint/golint; \ | |||||
| fi | |||||
| for PKG in $(PACKAGES); do golint -set_exit_status $$PKG || exit 1; done; | |||||
| .PHONY: test | |||||
| test: | |||||
| for PKG in $(PACKAGES); do go test -cover -coverprofile $$GOPATH/src/$$PKG/coverage.out $$PKG || exit 1; done; | |||||
| .PHONY: build | |||||
| build: | |||||
| go build . | |||||
| @@ -1,13 +1,16 @@ | |||||
| # Git Shell [](https://travis-ci.org/go-gitea/git) | |||||
| # Git Shell | |||||
| Package git is a Go module for Git access through shell commands. | |||||
| [](http://drone.gitea.io/go-gitea/git) | |||||
| [](https://gitter.im/go-gitea/gitea?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) | |||||
| [](http://microbadger.com/images/gitea/gitea "Get your own image badge on microbadger.com") | |||||
| [](https://coverage.gitea.io/go-gitea/git) | |||||
| [](https://goreportcard.com/report/code.gitea.io/git) | |||||
| [](https://godoc.org/code.gitea.io/git) | |||||
| ## Limitations | |||||
| - Go version must be at least **1.3**. | |||||
| - Git version must be no less than **1.7.1**, and great than or equal to **1.8.0** is recommended. | |||||
| - For Windows users, try use as higher version as possible. | |||||
| This project is a Go module to access Git through shell commands. For further | |||||
| informations take a look at the current [documentation](https://godoc.org/code.gitea.io/git). | |||||
| ## License | ## License | ||||
| This project is under the MIT License. See the [LICENSE](LICENSE) file for the full license text. | |||||
| This project is under the MIT License. See the [LICENSE](LICENSE) file for the | |||||
| full license text. | |||||
| @@ -102,13 +102,13 @@ func ListHooks(repoPath string) (_ []*Hook, err error) { | |||||
| } | } | ||||
| const ( | const ( | ||||
| HOOK_PATH_UPDATE = "hooks/update" | |||||
| HookPathUpdate = "hooks/update" | |||||
| ) | ) | ||||
| // SetUpdateHook writes given content to update hook of the reposiotry. | // SetUpdateHook writes given content to update hook of the reposiotry. | ||||
| func SetUpdateHook(repoPath, content string) (err error) { | func SetUpdateHook(repoPath, content string) (err error) { | ||||
| log("Setting update hook: %s", repoPath) | log("Setting update hook: %s", repoPath) | ||||
| hookPath := path.Join(repoPath, HOOK_PATH_UPDATE) | |||||
| hookPath := path.Join(repoPath, HookPathUpdate) | |||||
| if com.IsExist(hookPath) { | if com.IsExist(hookPath) { | ||||
| err = os.Remove(hookPath) | err = os.Remove(hookPath) | ||||
| } else { | } else { | ||||
| @@ -110,7 +110,7 @@ func (repo *Repository) GetTags() ([]string, error) { | |||||
| version.Sort(tags) | version.Sort(tags) | ||||
| // Reverse order | // Reverse order | ||||
| for i := 0; i < len(tags) / 2; i++ { | |||||
| for i := 0; i < len(tags)/2; i++ { | |||||
| j := len(tags) - i - 1 | j := len(tags) - i - 1 | ||||
| tags[i], tags[j] = tags[j], tags[i] | tags[i], tags[j] = tags[j], tags[i] | ||||
| } | } | ||||
| @@ -8,6 +8,7 @@ import ( | |||||
| "fmt" | "fmt" | ||||
| "path" | "path" | ||||
| "path/filepath" | "path/filepath" | ||||
| "runtime" | |||||
| "sort" | "sort" | ||||
| "strconv" | "strconv" | ||||
| "strings" | "strings" | ||||
| @@ -114,19 +115,31 @@ type commitInfo struct { | |||||
| err error | err error | ||||
| } | } | ||||
| // GetCommitsInfo takes advantages of concurrey to speed up getting information | |||||
| // of all commits that are corresponding to these entries. | |||||
| // TODO: limit max goroutines number should be configurable | |||||
| // GetCommitsInfo takes advantages of concurrency to speed up getting information | |||||
| // of all commits that are corresponding to these entries. This method will automatically | |||||
| // choose the right number of goroutine (concurrency) to use related of the host CPU. | |||||
| func (tes Entries) GetCommitsInfo(commit *Commit, treePath string) ([][]interface{}, error) { | func (tes Entries) GetCommitsInfo(commit *Commit, treePath string) ([][]interface{}, error) { | ||||
| return tes.GetCommitsInfoWithCustomConcurrency(commit, treePath, 0) | |||||
| } | |||||
| // GetCommitsInfoWithCustomConcurrency takes advantages of concurrency to speed up getting information | |||||
| // of all commits that are corresponding to these entries. If the given maxConcurrency is negative or | |||||
| // equal to zero: the right number of goroutine (concurrency) to use will be choosen related of the | |||||
| // host CPU. | |||||
| func (tes Entries) GetCommitsInfoWithCustomConcurrency(commit *Commit, treePath string, maxConcurrency int) ([][]interface{}, error) { | |||||
| if len(tes) == 0 { | if len(tes) == 0 { | ||||
| return nil, nil | return nil, nil | ||||
| } | } | ||||
| if maxConcurrency <= 0 { | |||||
| maxConcurrency = runtime.NumCPU() | |||||
| } | |||||
| // Length of taskChan determines how many goroutines (subprocesses) can run at the same time. | // Length of taskChan determines how many goroutines (subprocesses) can run at the same time. | ||||
| // The length of revChan should be same as taskChan so goroutines whoever finished job can | // The length of revChan should be same as taskChan so goroutines whoever finished job can | ||||
| // exit as early as possible, only store data inside channel. | // exit as early as possible, only store data inside channel. | ||||
| taskChan := make(chan bool, 10) | |||||
| revChan := make(chan commitInfo, 10) | |||||
| taskChan := make(chan bool, maxConcurrency) | |||||
| revChan := make(chan commitInfo, maxConcurrency) | |||||
| doneChan := make(chan error) | doneChan := make(chan error) | ||||
| // Receive loop will exit when it collects same number of data pieces as tree entries. | // Receive loop will exit when it collects same number of data pieces as tree entries. | ||||
| @@ -3,10 +3,10 @@ | |||||
| "ignore": "test", | "ignore": "test", | ||||
| "package": [ | "package": [ | ||||
| { | { | ||||
| "checksumSHA1": "/JuXxX+Zg9lk3zvT9c82ltavFdk=", | |||||
| "checksumSHA1": "X4WaxEtgFkM4VHg6TcNk2xkrqCI=", | |||||
| "path": "code.gitea.io/git", | "path": "code.gitea.io/git", | ||||
| "revision": "cddfff06fa8ed36571d43c1463ea63b3e6e8244b", | |||||
| "revisionTime": "2016-11-12T10:50:26Z" | |||||
| "revision": "0807b517283977be34f0ff5510b21e676fc1527c", | |||||
| "revisionTime": "2016-11-13T14:20:52Z" | |||||
| }, | }, | ||||
| { | { | ||||
| "checksumSHA1": "/uhZZppDeb3Rbp3h8C0ALR3hdrA=", | "checksumSHA1": "/uhZZppDeb3Rbp3h8C0ALR3hdrA=", | ||||