@@ -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=", | ||||