Browse Source

Merge pull request #1 from gogits/master

同151201
pull/4297/head
Mukaiu 9 years ago
parent
commit
99f8d0cc5b
  1. 5
      .bra.toml
  2. 20
      .dockerignore
  3. 3
      .gitignore
  4. 66
      .gopmfile
  5. 22
      .pkgr.yml
  6. 21
      .travis.yml
  7. 2
      CONTRIBUTING.md
  8. 31
      Dockerfile
  9. 35
      Makefile
  10. 124
      README.md
  11. 87
      README_ZH.md
  12. 13
      cmd/cert.go
  13. 42
      cmd/cmd.go
  14. 8
      cmd/dump.go
  15. 219
      cmd/serve.go
  16. 12
      cmd/update.go
  17. 363
      cmd/web.go
  18. 7
      conf/README
  19. 7
      conf/README.md
  20. 159
      conf/app.ini
  21. 11
      conf/gitignore/Actionscript
  22. 5
      conf/gitignore/Ada
  23. 1
      conf/gitignore/Agda
  24. 11
      conf/gitignore/Android
  25. 3
      conf/gitignore/Anjuta
  26. 2
      conf/gitignore/AppEngine
  27. 3
      conf/gitignore/AppceleratorTitanium
  28. 13
      conf/gitignore/ArchLinuxPackages
  29. 27
      conf/gitignore/Archives
  30. 14
      conf/gitignore/Autotools
  31. 4
      conf/gitignore/BricxCC
  32. 16
      conf/gitignore/C
  33. 2
      conf/gitignore/C Sharp
  34. 15
      conf/gitignore/C++
  35. 12
      conf/gitignore/CFWheels
  36. 6
      conf/gitignore/CMake
  37. 6
      conf/gitignore/CUDA
  38. 4
      conf/gitignore/CVS
  39. 13
      conf/gitignore/CakePHP
  40. 9
      conf/gitignore/ChefCookbook
  41. 3
      conf/gitignore/Cloud9
  42. 6
      conf/gitignore/CodeIgniter
  43. 3
      conf/gitignore/CodeKit
  44. 3
      conf/gitignore/CommonLisp
  45. 6
      conf/gitignore/Composer
  46. 3
      conf/gitignore/Concrete5
  47. 3
      conf/gitignore/Coq
  48. 3
      conf/gitignore/CraftCMS
  49. 5
      conf/gitignore/DM
  50. 15
      conf/gitignore/Dart
  51. 2
      conf/gitignore/DartEditor
  52. 57
      conf/gitignore/Delphi
  53. 3
      conf/gitignore/Dreamweaver
  54. 36
      conf/gitignore/Drupal
  55. 4
      conf/gitignore/EPiServer
  56. 36
      conf/gitignore/Eagle
  57. 39
      conf/gitignore/Eclipse
  58. 2
      conf/gitignore/EiffelStudio
  59. 5
      conf/gitignore/Elisp
  60. 4
      conf/gitignore/Elixir
  61. 32
      conf/gitignore/Emacs
  62. 4
      conf/gitignore/Ensime
  63. 10
      conf/gitignore/Erlang
  64. 1
      conf/gitignore/Espresso
  65. 19
      conf/gitignore/ExpressionEngine
  66. 4
      conf/gitignore/ExtJs
  67. 2
      conf/gitignore/Fancy
  68. 13
      conf/gitignore/Finale
  69. 3
      conf/gitignore/FlexBuilder
  70. 4
      conf/gitignore/ForceDotCom
  71. 2
      conf/gitignore/FuelPHP
  72. 28
      conf/gitignore/GWT
  73. 5
      conf/gitignore/Gcov
  74. 16
      conf/gitignore/GitBook
  75. 24
      conf/gitignore/Go
  76. 22
      conf/gitignore/Google Go
  77. 8
      conf/gitignore/Gradle
  78. 33
      conf/gitignore/Grails
  79. 16
      conf/gitignore/Haskell
  80. 5
      conf/gitignore/IGORPro
  81. 2
      conf/gitignore/IPythonNotebook
  82. 2
      conf/gitignore/Idris
  83. 13
      conf/gitignore/JDeveloper
  84. 2
      conf/gitignore/Java
  85. 19
      conf/gitignore/Jboss
  86. 3
      conf/gitignore/Jekyll
  87. 46
      conf/gitignore/JetBrains
  88. 525
      conf/gitignore/Joomla
  89. 2
      conf/gitignore/KDevelop4
  90. 3
      conf/gitignore/Kate
  91. 13
      conf/gitignore/KiCAD
  92. 2
      conf/gitignore/Kohana
  93. 16
      conf/gitignore/LabVIEW
  94. 4
      conf/gitignore/Laravel
  95. 30
      conf/gitignore/Lazarus
  96. 12
      conf/gitignore/Leiningen
  97. 21
      conf/gitignore/LemonStand
  98. 2
      conf/gitignore/LibreOffice
  99. 6
      conf/gitignore/Lilypond
  100. 7
      conf/gitignore/Linux
  101. Some files were not shown because too many files have changed in this diff Show More

5
.bra.toml

@ -13,8 +13,7 @@ watch_dirs = [
watch_exts = [".go"] watch_exts = [".go"]
build_delay = 1500 build_delay = 1500
cmds = [ cmds = [
#["go-bindata", "-o=modules/bindata/bindata.go", "-ignore=\\.DS_Store|README", "-pkg=bindata", "conf/..."], ["go", "install", "-race"], # sqlite redis memcache cert pam tidb
["go", "install", "-tags", "sqlite cert"],# redis memcache ["go", "build", "-race"],
["go", "build", "-tags", "sqlite cert"],
["./gogs", "web"] ["./gogs", "web"]
] ]

20
.dockerignore

@ -0,0 +1,20 @@
.git
.git/
.git/*
conf
conf/
conf/*
packager
packager/
packager/*
scripts
scripts/
scripts/*
*.yml
*.md
.bra.toml
.editorconfig
.gitignore
.gopmfile
config.codekit
LICENSE

3
.gitignore vendored

@ -29,10 +29,11 @@ profile/
__pycache__ __pycache__
*.pem *.pem
output* output*
config.codekit
.brackets.json .brackets.json
docker/fig.yml docker/fig.yml
docker/docker/Dockerfile docker/docker/Dockerfile
docker/docker/init_gogs.sh docker/docker/init_gogs.sh
gogs.sublime-project gogs.sublime-project
gogs.sublime-workspace gogs.sublime-workspace
.tags*
release

66
.gopmfile

@ -3,35 +3,47 @@ path = github.com/gogits/gogs
[deps] [deps]
github.com/bradfitz/gomemcache = commit:72a68649ba github.com/bradfitz/gomemcache = commit:72a68649ba
github.com/Unknwon/cae = commit:2e70a1351b github.com/codegangsta/cli = commit:0302d39
github.com/Unknwon/com = commit:188d690b1a github.com/go-macaron/binding = commit:864a5ce
github.com/Unknwon/i18n = commit:7457d88830 github.com/go-macaron/cache = commit:5617353
github.com/Unknwon/macaron = commit:93de4f3fad github.com/go-macaron/captcha = commit:8aa5919
github.com/codegangsta/cli = commit:2bcd11f863 github.com/go-macaron/csrf = commit:3372b25
github.com/go-sql-driver/mysql = commit:a197e5d405 github.com/go-macaron/gzip = commit:4938e9b
github.com/go-xorm/core = commit:be6e7ac47d github.com/go-macaron/i18n = commit:5e728b6
github.com/go-xorm/xorm = commit:1f0dd9bef2 github.com/go-macaron/inject = commit:c5ab7bf
github.com/go-macaron/session = commit:66031fc
github.com/go-macaron/toolbox = commit:ab30a81
github.com/go-sql-driver/mysql = commit:d512f20
github.com/go-xorm/core = commit:3e10003353
github.com/go-xorm/xorm = commit:c643188
github.com/gogits/chardet = commit:2404f77725 github.com/gogits/chardet = commit:2404f77725
github.com/gogits/go-gogs-client = commit:92e76d616a github.com/gogits/go-gogs-client = commit:7c02c95
github.com/lib/pq = commit:30ed2200d7 github.com/issue9/identicon = commit:5a61672
github.com/macaron-contrib/binding = commit:548a793679 github.com/klauspost/compress = commit:bbfa9dc
github.com/macaron-contrib/cache = commit:928d5c35cd github.com/klauspost/cpuid = commit:8d9fe96
github.com/macaron-contrib/captcha = commit:fbb8b1ebb5 github.com/klauspost/crc32 = commit:3e5c38b
github.com/macaron-contrib/csrf = commit:98ddf5a710 github.com/lib/pq = commit:83c4f41
github.com/macaron-contrib/i18n = commit:da2b19e90b github.com/mattn/go-sqlite3 = commit:5651a9d
github.com/macaron-contrib/oauth2 = commit:8f394c3629 github.com/mcuadros/go-version = commit:d52711f
github.com/macaron-contrib/session = commit:31e841d95c github.com/microcosm-cc/bluemonday = commit:4ac6f27
github.com/macaron-contrib/toolbox = commit:acbfe36e16 github.com/msteinert/pam = commit:6534f23b39
github.com/mattn/go-sqlite3 = commit:e28cd440fa github.com/nfnt/resize = commit:dc93e1b98c
github.com/microcosm-cc/bluemonday = commit:fcd0f5074e github.com/russross/blackfriday = commit:300106c
github.com/nfnt/resize = commit:53e9ca890b github.com/shurcooL/sanitized_anchor_name = commit:10ef21a
github.com/russross/blackfriday = commit:6928e11ecd github.com/Unknwon/cae = commit:7f5e046
github.com/shurcooL/go = commit:bc30a0bd33 github.com/Unknwon/com = commit:28b053d
golang.org/x/net = commit:7dbad50ab5 github.com/Unknwon/i18n = commit:7457d88830
golang.org/x/text = commit:5f741289c4 github.com/Unknwon/paginater = commit:7748a72
gopkg.in/ini.v1 = commit:177219109c golang.org/x/net =
golang.org/x/text =
golang.org/x/crypto =
gopkg.in/asn1-ber.v1 =
gopkg.in/gomail.v2 = commit:df6fc79
gopkg.in/ini.v1 = commit:2e44421
gopkg.in/ldap.v2 =
gopkg.in/macaron.v1 = commit:1c6dd87
gopkg.in/redis.v2 = commit:e617904962 gopkg.in/redis.v2 = commit:e617904962
[res] [res]
include = etc|public|scripts|templates include = public|scripts|templates

22
.pkgr.yml

@ -1,10 +1,24 @@
targets: targets:
debian-7: &debian
build_dependencies:
- libpam0g-dev
dependencies:
- libpam0g
- git
debian-8:
<<: *debian
ubuntu-14.04: ubuntu-14.04:
<<: *debian
ubuntu-12.04: ubuntu-12.04:
debian-7: <<: *debian
centos-6: centos-6: &el
dependencies: build_dependencies:
- git - pam-devel
dependencies:
- pam
- git
centos-7:
<<: *el
before: before:
- mv packager/Procfile . - mv packager/Procfile .
- mv packager/.godir . - mv packager/.godir .

21
.travis.yml

@ -1,16 +1,27 @@
language: go language: go
go: go:
- 1.2
- 1.3 - 1.3
- 1.4 - 1.4
- tip - 1.5
sudo: false before_install:
- sudo apt-get update -qq
- sudo apt-get install -y libpam-dev
- go get github.com/msteinert/pam
script: go build -v install:
- go get -t -v ./...
script: go build -v -tags "pam"
notifications: notifications:
email: email:
- u@gogs.io - u@gogs.io
slack: gophercn:o5pSanyTeNhnfYc3QnG0X7Wx slack: gophercn:o5pSanyTeNhnfYc3QnG0X7Wx
webhooks:
urls:
- https://webhooks.gitter.im/e/b590f8e03882f7aedc3e
on_success: change
on_failure: always
on_start: never

2
CONTRIBUTING.md

@ -42,7 +42,7 @@ There is no standard form of making a feature request. Just try to describe the
### Pull Request ### Pull Request
Pull requests are always welcome, but note that **ALL PULL REQUESTS MUST APPLY TO THE `DEV` BRANCH**. Pull requests are always welcome, but note that **ALL PULL REQUESTS MUST APPLY TO THE `develop` BRANCH**.
We are always thrilled to receive pull requests, and do our best to process them as fast as possible. Not sure if that typo is worth a pull request? Do it! We will appreciate it. We are always thrilled to receive pull requests, and do our best to process them as fast as possible. Not sure if that typo is worth a pull request? Do it! We will appreciate it.

31
Dockerfile

@ -1,17 +1,22 @@
FROM google/golang:latest FROM alpine:3.2
MAINTAINER roemer.jp@gmail.com
ENV TAGS="sqlite redis memcache cert" USER="git" HOME="/home/git" # Install system utils & Gogs runtime dependencies
ADD https://github.com/tianon/gosu/releases/download/1.6/gosu-amd64 /usr/sbin/gosu
RUN echo "@edge http://dl-4.alpinelinux.org/alpine/edge/main" | tee -a /etc/apk/repositories \
&& echo "@community http://dl-4.alpinelinux.org/alpine/edge/community" | tee -a /etc/apk/repositories \
&& apk -U --no-progress upgrade \
&& apk -U --no-progress add ca-certificates bash git linux-pam s6@edge curl openssh socat \
&& chmod +x /usr/sbin/gosu
COPY . /gopath/src/github.com/gogits/gogs/ ENV GOGS_CUSTOM /data/gogs
WORKDIR /gopath/src/github.com/gogits/gogs/
RUN go get -v -tags="$TAGS" github.com/gogits/gogs \ COPY . /app/gogs/
&& go build -tags="$TAGS" \ WORKDIR /app/gogs/
&& useradd -d $HOME -m $USER \ RUN ./docker/build.sh
&& chown -R $USER .
USER $USER # Configure Docker Container
VOLUME ["/data"]
ENTRYPOINT [ "./gogs" ] EXPOSE 22 3000
ENTRYPOINT ["docker/start.sh"]
CMD [ "web" ] CMD ["/bin/s6-svscan", "/app/gogs/docker/s6/"]

35
Makefile

@ -0,0 +1,35 @@
LDFLAGS += -X "github.com/gogits/gogs/modules/setting.BuildTime=$(shell date -u '+%Y-%m-%d %I:%M:%S %Z')"
LDFLAGS += -X "github.com/gogits/gogs/modules/setting.BuildGitHash=$(shell git rev-parse HEAD)"
TAGS = ""
RELEASE_ROOT = "release"
RELEASE_GOGS = "release/gogs"
NOW = $(shell date -u '+%Y%m%d%I%M%S')
.PHONY: build pack release bindata clean
build:
go install -ldflags '$(LDFLAGS)' -tags '$(TAGS)'
go build -ldflags '$(LDFLAGS)' -tags '$(TAGS)'
govet:
go tool vet -composites=false -methods=false -structtags=false .
pack:
rm -rf $(RELEASE_GOGS)
mkdir -p $(RELEASE_GOGS)
cp -r gogs LICENSE README.md README_ZH.md templates public scripts $(RELEASE_GOGS)
rm -rf $(RELEASE_GOGS)/public/config.codekit $(RELEASE_GOGS)/public/less
cd $(RELEASE_ROOT) && zip -r gogs.$(NOW).zip "gogs"
release: build pack
bindata:
go-bindata -o=modules/bindata/bindata.go -ignore="\\.DS_Store|README.md" -pkg=bindata conf/...
clean:
go clean -i ./...
clean-mac: clean
find . -name ".DS_Store" -print0 | xargs -0 rm

124
README.md

@ -3,88 +3,132 @@ Gogs - Go Git Service [![Build Status](https://travis-ci.org/gogits/gogs.svg?bra
[![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/gogits/gogs?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/gogits/gogs?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
Gogs (Go Git Service) is a painless self-hosted Git service. ![](public/img/gogs-large-resize.png)
![Demo](http://gogs.qiniudn.com/gogs_demo.gif) ##### Current version: 0.7.22 Beta
##### Current version: 0.6.1 Beta <table>
<tr>
<td width="33%"><img src="https://gogs.io/img/screenshots/1.png"></td>
<td width="33%"><img src="https://gogs.io/img/screenshots/2.png"></td>
<td width="33%"><img src="https://gogs.io/img/screenshots/3.png"></td>
</tr>
<tr>
<td><img src="https://gogs.io/img/screenshots/4.png"></td>
<td><img src="https://gogs.io/img/screenshots/5.png"></td>
<td><img src="https://gogs.io/img/screenshots/6.png"></td>
</tr>
<tr>
<td><img src="https://gogs.io/img/screenshots/7.png"></td>
<td><img src="https://gogs.io/img/screenshots/8.png"></td>
<td><img src="https://gogs.io/img/screenshots/9.png"></td>
</tr>
</table>
### NOTICES ### NOTICES
- Due to testing purpose, data of [try.gogs.io](https://try.gogs.io) has been reset in **Jan 28, 2015** and will reset multiple times after. Please do **NOT** put your important data on the site. - Due to testing purpose, data of [try.gogs.io](https://try.gogs.io) has been reset in **Jan 28, 2015** and will reset multiple times after. Please do **NOT** put your important data on the site.
- The demo site [try.gogs.io](https://try.gogs.io) is running under `develop` branch. - The demo site [try.gogs.io](https://try.gogs.io) is running under `develop` branch.
- You **MUST** read [CONTRIBUTING.md](CONTRIBUTING.md) before you start filing an issue or making a Pull Request, and **MUST** discuss with us on [Gitter](https://gitter.im/gogits/gogs) for UI changes and feature Pull Reuqests, otherwise it's high possibilities that we are not going to merge it. - :bangbang:<span style="color: red">You **MUST** read [CONTRIBUTING.md](CONTRIBUTING.md) before you start filing an issue or making a Pull Request, and **MUST** discuss with us on [Gitter](https://gitter.im/gogits/gogs) for UI changes, otherwise it's high possibilities that we are not going to merge it.</span>:bangbang:
- Please [start discussion](http://forum.gogs.io/category/2/general-discussion) or [ask a question](http://forum.gogs.io/category/4/getting-help) on [the forum](http://forum.gogs.io/). GitHub issue tracker only keeps **bugs** and **feature requests**, all other topics will be closed without reason.
- If you think there are vulnerabilities in the project, please talk privately to **u@gogs.io**. Thanks! - If you think there are vulnerabilities in the project, please talk privately to **u@gogs.io**. Thanks!
- If you're interested in using APIs, we have experimental support with [documentation](https://github.com/gogits/go-gogs-client/wiki).
- If your team/company is using Gogs and would like to put your logo on [our website](http://gogs.io), contact us by any means.
#### Other language version [简体中文](README_ZH.md)
- [简体中文](README_ZH.md)
## Purpose ## Purpose
The goal of this project is to make the easiest, fastest, and most painless way to set up a self-hosted Git service. With Go, this can be done via an independent binary distribution across **ALL platforms** that Go supports, including Linux, Mac OS X, and Windows. The goal of this project is to make the easiest, fastest, and most painless way of setting up a self-hosted Git service. With Go, this can be done with an independent binary distribution across **ALL platforms** that Go supports, including Linux, Mac OS X, Windows and ARM.
## Overview ## Overview
- Please see the [Documentation](http://gogs.io/docs/intro/) for project design, known issues, and change log. - Please see the [Documentation](http://gogs.io/docs/intro) for common usages and change log.
- See the [Trello Board](https://trello.com/b/uxAoeLUl/gogs-go-git-service) to follow the develop team. - See the [Trello Board](https://trello.com/b/uxAoeLUl/gogs-go-git-service) to follow the develop team.
- Want to try it before doing anything else? Do it [online](https://try.gogs.io/unknwon/gogs) or go down to the **Installation -> Install from binary** section! - Want to try it before doing anything else? Do it [online](https://try.gogs.io/gogs/gogs) or go down to the **Installation -> Install from binary** section!
- Having trouble? Get help with [Troubleshooting](http://gogs.io/docs/intro/troubleshooting.md). - Having trouble? Get help with [Troubleshooting](http://gogs.io/docs/intro/troubleshooting.html).
- Want to help with localization? Check out the [guide](http://gogs.io/docs/features/i18n.html)! - Want to help with localization? Check out the [guide](http://gogs.io/docs/features/i18n.html)!
## Features ## Features
- Activity timeline - Activity timeline
- SSH/HTTP(S) protocol support - SSH and HTTP/HTTPS protocols
- SMTP/LDAP/reverse proxy authentication support - SMTP/LDAP/Reverse proxy authentication
- Reverse proxy suburl support - Reverse proxy with sub-path
- Register/delete/rename account - Account/Organization/Repository management
- Create/manage/delete organization with team management - Repository/Organization webhooks (including Slack)
- Create/fork/migrate/mirror/delete/watch/rename/transfer public/private repository - Repository Git hooks/deploy keys
- Repository viewer/release/issue tracker - Repository issues and pull requests
- Repository and Organization level webhooks - Add/Remove repository collaborators
- Repository Git hooks - Gravatar and custom source
- Add/remove repository collaborators - Mail service
- Gravatar and cache support
- Mail service (register, issue)
- Administration panel - Administration panel
- Slack webhook integration - CI integration: [Drone](https://github.com/drone/drone)
- Drone CI integration - Supports MySQL, PostgreSQL, SQLite3 and [TiDB](https://github.com/pingcap/tidb) (experimental)
- Supports MySQL, PostgreSQL and SQLite3 - Multi-language support ([14 languages](https://crowdin.com/project/gogs))
- Social account login (GitHub, Google, QQ, Weibo)
- Multi-language support ([11 languages](https://crowdin.com/project/gogs))
## System Requirements ## System Requirements
- A cheap Raspberry Pi is powerful enough for basic functionality. - A cheap Raspberry Pi is powerful enough for basic functionality.
- At least 2 CPU cores and 1GB RAM would be the baseline for teamwork. - 2 CPU cores and 1GB RAM would be the baseline for teamwork.
## Browser Support
- Please see [Semantic UI](https://github.com/Semantic-Org/Semantic-UI#browser-support) for specific versions of supported browsers.
- The official support minimal size is **1024*768**, UI may still looks right in smaller size but no promises and fixes.
## Installation ## Installation
Make sure you install the [prerequisites](http://gogs.io/docs/installation/) first. Make sure you install the [prerequisites](http://gogs.io/docs/installation) first.
There are 5 ways to install Gogs: There are 5 ways to install Gogs:
- [Install from binary](http://gogs.io/docs/installation/install_from_binary.md) - [Install from binary](http://gogs.io/docs/installation/install_from_binary.html)
- [Install from source](http://gogs.io/docs/installation/install_from_source.md) - [Install from source](http://gogs.io/docs/installation/install_from_source.html)
- [Install from packages](http://gogs.io/docs/installation/install_from_packages.md) - [Install from packages](http://gogs.io/docs/installation/install_from_packages.html)
- [Ship with Docker](https://github.com/gogits/gogs/tree/master/docker) - [Ship with Docker](https://github.com/gogits/gogs/tree/master/docker)
- [Install with Vagrant](https://github.com/geerlingguy/ansible-vagrant-examples/tree/master/gogs) - [Install with Vagrant](https://github.com/geerlingguy/ansible-vagrant-examples/tree/master/gogs)
### Tutorials
- [How To Set Up Gogs on Ubuntu 14.04](https://www.digitalocean.com/community/tutorials/how-to-set-up-gogs-on-ubuntu-14-04)
- [Run your own GitHub-like service with the help of Docker](http://blog.hypriot.com/post/run-your-own-github-like-service-with-docker/)
- [使用 Gogs 搭建自己的 Git 服务器](https://mynook.info/blog/post/host-your-own-git-server-using-gogs) (Chinese)
- [阿里云上 Ubuntu 14.04 64 位安装 Gogs](http://my.oschina.net/luyao/blog/375654) (Chinese)
- [Installing Gogs on FreeBSD](https://www.codejam.info/2015/03/installing-gogs-on-freebsd.html)
- [Gogs on Raspberry Pi](http://blog.meinside.pe.kr/Gogs-on-Raspberry-Pi/)
### Screencasts
- [Instalando Gogs no Ubuntu](http://blog.linuxpro.com.br/2015/08/14/instalando-gogs-no-ubuntu/) (Português)
### Deploy to Cloud
- [OpenShift](https://github.com/tkisme/gogs-openshift)
- [Cloudron](https://cloudron.io/appstore.html#io.gogs.cloudronapp)
- [Scaleway](https://www.scaleway.com/imagehub/gogs/)
- [Portal](https://portaldemo.xyz/cloud/)
- [Sandstorm](https://github.com/cem/gogs-sandstorm)
### Product Support
- [Synology](https://www.synology.com) (Docker)
- [One Space](http://www.onespace.cc) (App Store)
## Acknowledgments ## Acknowledgments
- Router and middleware mechanism of [Macaron](https://github.com/Unknwon/macaron). - Router and middleware mechanism of [Macaron](https://github.com/go-macaron/macaron).
- Mail Service, modules design is inspired by [WeTalk](https://github.com/beego/wetalk). - Modules design is inspired by [WeTalk](https://github.com/beego/wetalk).
- System Monitor Status is inspired by [GoBlog](https://github.com/fuxiaohei/goblog). - System Monitor Status is inspired by [GoBlog](https://github.com/fuxiaohei/goblog).
- Thanks [lavachen](http://www.lavachen.cn/) and [Rocker](http://weibo.com/rocker1989) for designing Logo. - Thanks [lavachen](http://www.lavachen.cn/) and [Rocker](http://weibo.com/rocker1989) for designing Logo.
- Thanks [gobuild.io](http://gobuild.io) for providing binary compile and download service.
- Thanks [Crowdin](https://crowdin.com/project/gogs) for providing open source translation plan. - Thanks [Crowdin](https://crowdin.com/project/gogs) for providing open source translation plan.
- Thanks [DigitalOcean](https://www.digitalocean.com) for hosting home and demo sites.
## Contributors ## Contributors
- The [core team](http://gogs.io/team) of this project. - Ex-team members [@lunny](https://github.com/lunny), [@fuxiaohei](https://github.com/fuxiaohei) and [@slene](https://github.com/slene).
- See [contributors page](https://github.com/gogits/gogs/graphs/contributors) for full list of contributors. - See [contributors page](https://github.com/gogits/gogs/graphs/contributors) for full list of contributors.
- See [TRANSLATORS](conf/locale/TRANSLATORS) for full list of translators. - See [TRANSLATORS](conf/locale/TRANSLATORS) for public list of translators.
## License ## License

87
README_ZH.md

@ -1,77 +1,92 @@
Gogs - Go Git Service [![Build Status](https://travis-ci.org/gogits/gogs.svg?branch=master)](https://travis-ci.org/gogits/gogs) Gogs - Go Git Service [![Build Status](https://travis-ci.org/gogits/gogs.svg?branch=master)](https://travis-ci.org/gogits/gogs)
===================== =====================
Gogs (Go Git Service) 是一款可轻易搭建的自助 Git 服务。 Gogs (Go Git Service) 是一款极易搭建的自助 Git 服务。
![Demo](http://gogs.qiniudn.com/gogs_demo.gif)
##### 当前版本:0.6.1 Beta
## 开发目的 ## 开发目的
Gogs 的目标是打造一个最简单、最快速和最轻松的方式搭建自助 Git 服务。使用 Go 语言开发使得 Gogs 能够通过独立的二进制分发,并且支持 Go 语言支持的 **所有平台**,包括 Linux、Mac OS X 以及 Windows Gogs 的目标是打造一个最简单、最快速和最轻松的方式搭建自助 Git 服务。使用 Go 语言开发使得 Gogs 能够通过独立的二进制分发,并且支持 Go 语言支持的 **所有平台**,包括 Linux、Mac OS X、Windows 以及 ARM 平台。
## 项目概览 ## 项目概览
- 有关项目设计、已知问题和变更日志,请通过 [使用手册](http://gogs.io/docs/intro/) 查看。 - 有关基本用法和变更日志,请通过 [使用手册](http://gogs.io/docs/intro/) 查看。
- 您可以到 [Trello Board](https://trello.com/b/uxAoeLUl/gogs-go-git-service) 跟随开发团队的脚步。 - 您可以到 [Trello Board](https://trello.com/b/uxAoeLUl/gogs-go-git-service) 跟随开发团队的脚步。
- 想要先睹为快?通过 [在线体验](https://try.gogs.io/unknwon/gogs) 或查看 **安装部署 -> 二进制安装** 小节。 - 想要先睹为快?通过 [在线体验](https://try.gogs.io/gogs/gogs) 或查看 **安装部署 -> 二进制安装** 小节。
- 使用过程中遇到问题?尝试从 [故障排查](http://gogs.io/docs/intro/troubleshooting.md) 页面获取帮助。 - 使用过程中遇到问题?尝试从 [故障排查](http://gogs.io/docs/intro/troubleshooting.html) 页面获取帮助。
- 希望帮助多国语言界面的翻译吗?请立即访问 [详情页面](http://gogs.io/docs/features/i18n.html)! - 希望帮助多国语言界面的翻译吗?请立即访问 [详情页面](http://gogs.io/docs/features/i18n.html)!
## 功能特性 ## 功能特性
- 活动时间线 - 支持活动时间线
- 支持 SSH/HTTP(S) 协议 - 支持 SSH 以及 HTTP/HTTPS 协议
- 支持 SMTP/LDAP/反向代理 用户认证 - 支持 SMTP、LDAP 和反向代理的用户认证
- 支持反向代理子路径 - 支持反向代理子路径
- 支持 注册/删除/重命名 用户 - 支持用户、组织和仓库管理系统
- 支持 创建/管理/删除 组织以及团队管理功能 - 支持仓库和组织级别 Web 钩子(包括 Slack 集成)
- 支持 创建/派生/迁移/镜像/删除/关注/重命名/转移 公开/私有 仓库 - 支持仓库 Git 钩子和部署密钥
- 支持仓库 浏览/发布/工单管理 - 支持仓库工单(Issue)和合并请求(Pull Request)
- 支持仓库和组织级别 Web 钩子 - 支持添加和删除仓库协作者
- 支持仓库 Git 钩子 - 支持 Gravatar 以及自定义源
- 支持 添加/删除 仓库协作者 - 支持邮件服务
- 支持 Gravatar 以及本地缓存 - 支持后台管理面板
- 支持邮件服务(注册、Issue) - 支持 CI 集成:[Drone](https://github.com/drone/drone)
- 管理员面板 - 支持 MySQL、PostgreSQL、SQLite3 和 [TiDB](https://github.com/pingcap/tidb)(实验性支持) 数据库
- Slack Web 钩子集成 - 支持多语言本地化([14 种语言]([more](https://crowdin.com/project/gogs)))
- Drone CI 持续部署集成
- 支持 MySQL、PostgreSQL 以及 SQLite3 数据库
- 社交帐号登录(GitHub、Google、QQ、微博)
- 多语言支持([11 种语言]([more](https://crowdin.com/project/gogs)))
## 系统要求 ## 系统要求
- 最低的系统硬件要求为一个廉价的树莓派 - 最低的系统硬件要求为一个廉价的树莓派
- 如果用于团队项目,建议使用 2 核 CPU 及 1GB 内存 - 如果用于团队项目,建议使用 2 核 CPU 及 1GB 内存
## 浏览器支持
- 请根据 [Semantic UI](https://github.com/Semantic-Org/Semantic-UI#browser-support) 查看具体支持的浏览器版本。
- 官方支持的最小 UI 尺寸为 **1024*768**,UI 不一定会在更小尺寸的设备上被破坏,但我们无法保证且不会修复。
## 安装部署 ## 安装部署
在安装 Gogs 之前,您需要先安装 [基本环境](http://gogs.io/docs/installation/)。 在安装 Gogs 之前,您需要先安装 [基本环境](http://gogs.io/docs/installation)。
然后,您可以通过以下 5 种方式来安装 Gogs: 然后,您可以通过以下 5 种方式来安装 Gogs:
- [二进制安装](http://gogs.io/docs/installation/install_from_binary.md) - [二进制安装](http://gogs.io/docs/installation/install_from_binary.html)
- [源码安装](http://gogs.io/docs/installation/install_from_source.md) - [源码安装](http://gogs.io/docs/installation/install_from_source.html)
- [包管理安装](http://gogs.io/docs/installation/install_from_packages.md) - [包管理安装](http://gogs.io/docs/installation/install_from_packages.html)
- [采用 Docker 部署](https://github.com/gogits/gogs/tree/master/docker) - [采用 Docker 部署](https://github.com/gogits/gogs/tree/master/docker)
- [通过 Vagrant 安装](https://github.com/geerlingguy/ansible-vagrant-examples/tree/master/gogs) - [通过 Vagrant 安装](https://github.com/geerlingguy/ansible-vagrant-examples/tree/master/gogs)
### 使用教程
- [使用 Gogs 搭建自己的 Git 服务器](https://mynook.info/blog/post/host-your-own-git-server-using-gogs)
- [阿里云上 Ubuntu 14.04 64 位安装 Gogs](http://my.oschina.net/luyao/blog/375654)
### 云端部署
- [OpenShift](https://github.com/tkisme/gogs-openshift)
- [Cloudron](https://cloudron.io/appstore.html#io.gogs.cloudronapp)
- [Scaleway](https://www.scaleway.com/imagehub/gogs/)
- [Portal](https://portaldemo.xyz/cloud/)
- [Sandstorm](https://github.com/cem/gogs-sandstorm)
### 产品支持
- [Synology](https://www.synology.com)(Docker)
- [One Space](http://www.onespace.cc)(应用商店)
## 特别鸣谢 ## 特别鸣谢
- 基于 [Macaron](https://github.com/Unknwon/macaron) 的路由与中间件机制。 - 基于 [Macaron](https://github.com/go-macaron/macaron) 的路由与中间件机制。
- 基于 [WeTalk](https://github.com/beego/wetalk) 修改的邮件服务和模块设计。 - 基于 [WeTalk](https://github.com/beego/wetalk) 修改的模块设计。
- 基于 [GoBlog](https://github.com/fuxiaohei/goblog) 修改的系统监视状态。 - 基于 [GoBlog](https://github.com/fuxiaohei/goblog) 修改的系统监视状态。
- 感谢 [gobuild.io](http://gobuild.io) 提供二进制编译与下载服务。
- 感谢 [lavachen](http://www.lavachen.cn/) 和 [Rocker](http://weibo.com/rocker1989) 设计的 Logo。 - 感谢 [lavachen](http://www.lavachen.cn/) 和 [Rocker](http://weibo.com/rocker1989) 设计的 Logo。
- 感谢 [Crowdin](https://crowdin.com/project/gogs) 提供免费的开源项目本地化支持。 - 感谢 [Crowdin](https://crowdin.com/project/gogs) 提供免费的开源项目本地化支持。
- 感谢 [DigitalOcean](https://www.digitalocean.com) 提供主站和体验站点的服务器赞助。
## 贡献成员 ## 贡献成员
- 本项目的 [开发团队](http://gogs.io/team)。 - 前团队成员 [@lunny](https://github.com/lunny)、[@fuxiaohei](https://github.com/fuxiaohei) 和 [@slene](https://github.com/slene)。
- 您可以通过查看 [贡献者页面](https://github.com/gogits/gogs/graphs/contributors) 获取完整的贡献者列表。 - 您可以通过查看 [贡献者页面](https://github.com/gogits/gogs/graphs/contributors) 获取完整的贡献者列表。
- 您可以通过查看 [TRANSLATORS](conf/locale/TRANSLATORS) 文件获取完整的翻译人员列表。 - 您可以通过查看 [TRANSLATORS](conf/locale/TRANSLATORS) 文件获取公开的翻译人员列表。
## 授权许可 ## 授权许可

13
cmd/cert.go

@ -32,12 +32,12 @@ var CmdCert = cli.Command{
Outputs to 'cert.pem' and 'key.pem' and will overwrite existing files.`, Outputs to 'cert.pem' and 'key.pem' and will overwrite existing files.`,
Action: runCert, Action: runCert,
Flags: []cli.Flag{ Flags: []cli.Flag{
cli.StringFlag{"host", "", "Comma-separated hostnames and IPs to generate a certificate for", ""}, stringFlag("host", "", "Comma-separated hostnames and IPs to generate a certificate for"),
cli.StringFlag{"ecdsa-curve", "", "ECDSA curve to use to generate a key. Valid values are P224, P256, P384, P521", ""}, stringFlag("ecdsa-curve", "", "ECDSA curve to use to generate a key. Valid values are P224, P256, P384, P521"),
cli.IntFlag{"rsa-bits", 2048, "Size of RSA key to generate. Ignored if --ecdsa-curve is set", ""}, intFlag("rsa-bits", 2048, "Size of RSA key to generate. Ignored if --ecdsa-curve is set"),
cli.StringFlag{"start-date", "", "Creation date formatted as Jan 1 15:04:05 2011", ""}, stringFlag("start-date", "", "Creation date formatted as Jan 1 15:04:05 2011"),
cli.DurationFlag{"duration", 365 * 24 * time.Hour, "Duration that certificate is valid for", ""}, durationFlag("duration", 365*24*time.Hour, "Duration that certificate is valid for"),
cli.BoolFlag{"ca", "whether this cert should be its own Certificate Authority", ""}, boolFlag("ca", "whether this cert should be its own Certificate Authority"),
}, },
} }
@ -114,6 +114,7 @@ func runCert(ctx *cli.Context) {
SerialNumber: serialNumber, SerialNumber: serialNumber,
Subject: pkix.Name{ Subject: pkix.Name{
Organization: []string{"Acme Co"}, Organization: []string{"Acme Co"},
CommonName: "Gogs",
}, },
NotBefore: notBefore, NotBefore: notBefore,
NotAfter: notAfter, NotAfter: notAfter,

42
cmd/cmd.go

@ -0,0 +1,42 @@
// Copyright 2015 The Gogs Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
package cmd
import (
"time"
"github.com/codegangsta/cli"
)
func stringFlag(name, value, usage string) cli.StringFlag {
return cli.StringFlag{
Name: name,
Value: value,
Usage: usage,
}
}
func boolFlag(name, usage string) cli.BoolFlag {
return cli.BoolFlag{
Name: name,
Usage: usage,
}
}
func intFlag(name string, value int, usage string) cli.IntFlag {
return cli.IntFlag{
Name: name,
Value: value,
Usage: usage,
}
}
func durationFlag(name string, value time.Duration, usage string) cli.DurationFlag {
return cli.DurationFlag{
Name: name,
Value: value,
Usage: usage,
}
}

8
cmd/dump.go

@ -25,8 +25,8 @@ var CmdDump = cli.Command{
It can be used for backup and capture Gogs server image to send to maintainer`, It can be used for backup and capture Gogs server image to send to maintainer`,
Action: runDump, Action: runDump,
Flags: []cli.Flag{ Flags: []cli.Flag{
cli.StringFlag{"config, c", "custom/conf/app.ini", "Custom configuration file path", ""}, stringFlag("config, c", "custom/conf/app.ini", "Custom configuration file path"),
cli.BoolFlag{"verbose, v", "show process details", ""}, boolFlag("verbose, v", "show process details"),
}, },
} }
@ -34,8 +34,8 @@ func runDump(ctx *cli.Context) {
if ctx.IsSet("config") { if ctx.IsSet("config") {
setting.CustomConf = ctx.String("config") setting.CustomConf = ctx.String("config")
} }
setting.NewConfigContext() setting.NewContext()
models.LoadModelsConfig() models.LoadConfigs()
models.SetEngine() models.SetEngine()
log.Printf("Dumping local repositories...%s", setting.RepoRootPath) log.Printf("Dumping local repositories...%s", setting.RepoRootPath)

219
cmd/serve.go

@ -5,6 +5,7 @@
package cmd package cmd
import ( import (
"crypto/tls"
"fmt" "fmt"
"os" "os"
"os/exec" "os/exec"
@ -16,6 +17,7 @@ import (
"github.com/codegangsta/cli" "github.com/codegangsta/cli"
"github.com/gogits/gogs/models" "github.com/gogits/gogs/models"
"github.com/gogits/gogs/modules/httplib"
"github.com/gogits/gogs/modules/log" "github.com/gogits/gogs/modules/log"
"github.com/gogits/gogs/modules/setting" "github.com/gogits/gogs/modules/setting"
"github.com/gogits/gogs/modules/uuid" "github.com/gogits/gogs/modules/uuid"
@ -31,12 +33,12 @@ var CmdServ = cli.Command{
Description: `Serv provide access auth for repositories`, Description: `Serv provide access auth for repositories`,
Action: runServ, Action: runServ,
Flags: []cli.Flag{ Flags: []cli.Flag{
cli.StringFlag{"config, c", "custom/conf/app.ini", "Custom configuration file path", ""}, stringFlag("config, c", "custom/conf/app.ini", "Custom configuration file path"),
}, },
} }
func setup(logPath string) { func setup(logPath string) {
setting.NewConfigContext() setting.NewContext()
log.NewGitLogger(filepath.Join(setting.LogRootPath, logPath)) log.NewGitLogger(filepath.Join(setting.LogRootPath, logPath))
if setting.DisableSSH { if setting.DisableSSH {
@ -44,9 +46,9 @@ func setup(logPath string) {
os.Exit(1) os.Exit(1)
} }
models.LoadModelsConfig() models.LoadConfigs()
if setting.UseSQLite3 { if setting.UseSQLite3 || setting.UseTiDB {
workDir, _ := setting.WorkDir() workDir, _ := setting.WorkDir()
os.Chdir(workDir) os.Chdir(workDir)
} }
@ -63,102 +65,183 @@ func parseCmd(cmd string) (string, string) {
} }
var ( var (
COMMANDS = map[string]models.AccessMode{ allowedCommands = map[string]models.AccessMode{
"git-upload-pack": models.ACCESS_MODE_READ, "git-upload-pack": models.ACCESS_MODE_READ,
"git-upload-archive": models.ACCESS_MODE_READ, "git-upload-archive": models.ACCESS_MODE_READ,
"git-receive-pack": models.ACCESS_MODE_WRITE, "git-receive-pack": models.ACCESS_MODE_WRITE,
} }
) )
func runServ(c *cli.Context) { func fail(userMessage, logMessage string, args ...interface{}) {
if c.IsSet("config") { fmt.Fprintln(os.Stderr, "Gogs:", userMessage)
setting.CustomConf = c.String("config")
if len(logMessage) > 0 {
if !setting.ProdMode {
fmt.Fprintf(os.Stderr, logMessage, args...)
}
log.GitLogger.Fatal(3, logMessage, args...)
return
} }
setup("serv.log")
fail := func(userMessage, logMessage string, args ...interface{}) { log.GitLogger.Close()
fmt.Fprintln(os.Stderr, "Gogs: ", userMessage) os.Exit(1)
log.GitLogger.Fatal(2, logMessage, args...) }
func handleUpdateTask(uuid string, user *models.User, repoUserName, repoName string) {
task, err := models.GetUpdateTaskByUUID(uuid)
if err != nil {
if models.IsErrUpdateTaskNotExist(err) {
log.GitLogger.Trace("No update task is presented: %s", uuid)
return
}
log.GitLogger.Fatal(2, "GetUpdateTaskByUUID: %v", err)
} }
if len(c.Args()) < 1 { if err = models.Update(task.RefName, task.OldCommitID, task.NewCommitID,
fail("Not enough arguments", "Not enough arugments") user.Name, repoUserName, repoName, user.Id); err != nil {
log.GitLogger.Error(2, "Update: %v", err)
} }
keys := strings.Split(c.Args()[0], "-") if err = models.DeleteUpdateTaskByUUID(uuid); err != nil {
if len(keys) != 2 { log.GitLogger.Fatal(2, "DeleteUpdateTaskByUUID: %v", err)
fail("key-id format error", "Invalid key id: %s", c.Args()[0])
} }
keyId, err := com.StrTo(keys[1]).Int64() // Ask for running deliver hook and test pull request tasks.
if err != nil { reqURL := setting.AppUrl + repoUserName + "/" + repoName + "/tasks/trigger?branch=" +
fail("key-id format error", "Invalid key id: %s", err) strings.TrimPrefix(task.RefName, "refs/heads/")
log.GitLogger.Trace("Trigger task: %s", reqURL)
resp, err := httplib.Head(reqURL).SetTLSClientConfig(&tls.Config{
InsecureSkipVerify: true,
}).Response()
if err == nil {
resp.Body.Close()
if resp.StatusCode/100 != 2 {
log.GitLogger.Error(2, "Fail to trigger task: not 2xx response code")
}
} else {
log.GitLogger.Error(2, "Fail to trigger task: %v", err)
} }
}
user, err := models.GetUserByKeyId(keyId) func runServ(c *cli.Context) {
if err != nil { if c.IsSet("config") {
fail("internal error", "Fail to get user by key ID(%d): %v", keyId, err) setting.CustomConf = c.String("config")
}
setup("serv.log")
if len(c.Args()) < 1 {
fail("Not enough arguments", "Not enough arguments")
} }
cmd := os.Getenv("SSH_ORIGINAL_COMMAND") cmd := os.Getenv("SSH_ORIGINAL_COMMAND")
if cmd == "" { if len(cmd) == 0 {
println("Hi", user.Name, "! You've successfully authenticated, but Gogs does not provide shell access.") println("Hi there, You've successfully authenticated, but Gogs does not provide shell access.")
if user.IsAdmin { println("If this is unexpected, please log in with password and setup Gogs under another user.")
println("If this is unexpected, please log in with password and setup Gogs under another user.")
}
return return
} }
verb, args := parseCmd(cmd) verb, args := parseCmd(cmd)
repoPath := strings.Trim(args, "'") repoPath := strings.ToLower(strings.Trim(args, "'"))
rr := strings.SplitN(repoPath, "/", 2) rr := strings.SplitN(repoPath, "/", 2)
if len(rr) != 2 { if len(rr) != 2 {
fail("Invalid repository path", "Invalide repository path: %v", args) fail("Invalid repository path", "Invalid repository path: %v", args)
} }
repoUserName := rr[0] repoUserName := strings.ToLower(rr[0])
repoName := strings.TrimSuffix(rr[1], ".git") repoName := strings.ToLower(strings.TrimSuffix(rr[1], ".git"))
repoUser, err := models.GetUserByName(repoUserName) repoUser, err := models.GetUserByName(repoUserName)
if err != nil { if err != nil {
if err == models.ErrUserNotExist { if models.IsErrUserNotExist(err) {
fail("Repository owner does not exist", "Unregistered owner: %s", repoUserName) fail("Repository owner does not exist", "Unregistered owner: %s", repoUserName)
} }
fail("Internal error", "Fail to get repository owner(%s): %v", repoUserName, err) fail("Internal error", "Failed to get repository owner(%s): %v", repoUserName, err)
} }
repo, err := models.GetRepositoryByName(repoUser.Id, repoName) repo, err := models.GetRepositoryByName(repoUser.Id, repoName)
if err != nil { if err != nil {
if models.IsErrRepoNotExist(err) { if models.IsErrRepoNotExist(err) {
if user.Id == repoUser.Id || repoUser.IsOwnedBy(user.Id) { fail(_ACCESS_DENIED_MESSAGE, "Repository does not exist: %s/%s", repoUser.Name, repoName)
fail("Repository does not exist", "Repository does not exist: %s/%s", repoUser.Name, repoName)
} else {
fail(_ACCESS_DENIED_MESSAGE, "Repository does not exist: %s/%s", repoUser.Name, repoName)
}
} }
fail("Internal error", "Fail to get repository: %v", err) fail("Internal error", "Failed to get repository: %v", err)
} }
requestedMode, has := COMMANDS[verb] requestedMode, has := allowedCommands[verb]
if !has { if !has {
fail("Unknown git command", "Unknown git command %s", verb) fail("Unknown git command", "Unknown git command %s", verb)
} }
mode, err := models.AccessLevel(user, repo) // Prohibit push to mirror repositories.
if err != nil { if requestedMode > models.ACCESS_MODE_READ && repo.IsMirror {
fail("Internal error", "Fail to check access: %v", err) fail("mirror repository is read-only", "")
} else if mode < requestedMode { }
clientMessage := _ACCESS_DENIED_MESSAGE
if mode >= models.ACCESS_MODE_READ { // Allow anonymous clone for public repositories.
clientMessage = "You do not have sufficient authorization for this action" var (
keyID int64
user *models.User
)
if requestedMode == models.ACCESS_MODE_WRITE || repo.IsPrivate {
keys := strings.Split(c.Args()[0], "-")
if len(keys) != 2 {
fail("Key ID format error", "Invalid key argument: %s", c.Args()[0])
}
key, err := models.GetPublicKeyByID(com.StrTo(keys[1]).MustInt64())
if err != nil {
fail("Invalid key ID", "Invalid key ID[%s]: %v", c.Args()[0], err)
}
keyID = key.ID
// Check deploy key or user key.
if key.Type == models.KEY_TYPE_DEPLOY {
if key.Mode < requestedMode {
fail("Key permission denied", "Cannot push with deployment key: %d", key.ID)
}
// Check if this deploy key belongs to current repository.
if !models.HasDeployKey(key.ID, repo.ID) {
fail("Key access denied", "Key access denied: %d-%d", key.ID, repo.ID)
}
// Update deploy key activity.
deployKey, err := models.GetDeployKeyByRepo(key.ID, repo.ID)
if err != nil {
fail("Internal error", "GetDeployKey: %v", err)
}
deployKey.Updated = time.Now()
if err = models.UpdateDeployKey(deployKey); err != nil {
fail("Internal error", "UpdateDeployKey: %v", err)
}
} else {
user, err = models.GetUserByKeyID(key.ID)
if err != nil {
fail("internal error", "Failed to get user by key ID(%d): %v", keyID, err)
}
mode, err := models.AccessLevel(user, repo)
if err != nil {
fail("Internal error", "Fail to check access: %v", err)
} else if mode < requestedMode {
clientMessage := _ACCESS_DENIED_MESSAGE
if mode >= models.ACCESS_MODE_READ {
clientMessage = "You do not have sufficient authorization for this action"
}
fail(clientMessage,
"User %s does not have level %v access to repository %s",
user.Name, requestedMode, repoPath)
}
} }
fail(clientMessage,
"User %s does not have level %v access to repository %s",
user.Name, requestedMode, repoPath)
} }
uuid := uuid.NewV4().String() uuid := uuid.NewV4().String()
os.Setenv("uuid", uuid) os.Setenv("uuid", uuid)
// Special handle for Windows.
if setting.IsWindows {
verb = strings.Replace(verb, "-", " ", 1)
}
var gitcmd *exec.Cmd var gitcmd *exec.Cmd
verbs := strings.Split(verb, " ") verbs := strings.Split(verb, " ")
if len(verbs) == 2 { if len(verbs) == 2 {
@ -171,35 +254,23 @@ func runServ(c *cli.Context) {
gitcmd.Stdin = os.Stdin gitcmd.Stdin = os.Stdin
gitcmd.Stderr = os.Stderr gitcmd.Stderr = os.Stderr
if err = gitcmd.Run(); err != nil { if err = gitcmd.Run(); err != nil {
fail("Internal error", "Fail to execute git command: %v", err) fail("Internal error", "Failed to execute git command: %v", err)
} }
if requestedMode == models.ACCESS_MODE_WRITE { if requestedMode == models.ACCESS_MODE_WRITE {
tasks, err := models.GetUpdateTasksByUuid(uuid) handleUpdateTask(uuid, user, repoUserName, repoName)
if err != nil { }
log.GitLogger.Fatal(2, "GetUpdateTasksByUuid: %v", err)
}
for _, task := range tasks { // Update user key activity.
err = models.Update(task.RefName, task.OldCommitId, task.NewCommitId, if keyID > 0 {
user.Name, repoUserName, repoName, user.Id) key, err := models.GetPublicKeyByID(keyID)
if err != nil { if err != nil {
log.GitLogger.Error(2, "Fail to update: %v", err) fail("Internal error", "GetPublicKeyById: %v", err)
}
} }
if err = models.DelUpdateTasksByUuid(uuid); err != nil { key.Updated = time.Now()
log.GitLogger.Fatal(2, "DelUpdateTasksByUuid: %v", err) if err = models.UpdatePublicKey(key); err != nil {
fail("Internal error", "UpdatePublicKey: %v", err)
} }
} }
// Update key activity.
key, err := models.GetPublicKeyById(keyId)
if err != nil {
fail("Internal error", "GetPublicKeyById: %v", err)
}
key.Updated = time.Now()
if err = models.UpdatePublicKey(key); err != nil {
fail("Internal error", "UpdatePublicKey: %v", err)
}
} }

12
cmd/update.go

@ -20,7 +20,7 @@ var CmdUpdate = cli.Command{
Description: `Update get pushed info and insert into database`, Description: `Update get pushed info and insert into database`,
Action: runUpdate, Action: runUpdate,
Flags: []cli.Flag{ Flags: []cli.Flag{
cli.StringFlag{"config, c", "custom/conf/app.ini", "Custom configuration file path", ""}, stringFlag("config, c", "custom/conf/app.ini", "Custom configuration file path"),
}, },
} }
@ -42,16 +42,14 @@ func runUpdate(c *cli.Context) {
log.GitLogger.Fatal(2, "refName is empty, shouldn't use") log.GitLogger.Fatal(2, "refName is empty, shouldn't use")
} }
uuid := os.Getenv("uuid")
task := models.UpdateTask{ task := models.UpdateTask{
Uuid: uuid, UUID: os.Getenv("uuid"),
RefName: args[0], RefName: args[0],
OldCommitId: args[1], OldCommitID: args[1],
NewCommitId: args[2], NewCommitID: args[2],
} }
if err := models.AddUpdateTask(&task); err != nil { if err := models.AddUpdateTask(&task); err != nil {
log.GitLogger.Fatal(2, err.Error()) log.GitLogger.Fatal(2, "AddUpdateTask: %v", err)
} }
} }

363
cmd/web.go

@ -7,7 +7,7 @@ package cmd
import ( import (
"crypto/tls" "crypto/tls"
"fmt" "fmt"
"html/template" gotmpl "html/template"
"io/ioutil" "io/ioutil"
"net/http" "net/http"
"net/http/fcgi" "net/http/fcgi"
@ -15,17 +15,19 @@ import (
"path" "path"
"strings" "strings"
"github.com/Unknwon/macaron"
"github.com/codegangsta/cli" "github.com/codegangsta/cli"
"github.com/macaron-contrib/binding" "github.com/go-macaron/binding"
"github.com/macaron-contrib/cache" "github.com/go-macaron/cache"
"github.com/macaron-contrib/captcha" "github.com/go-macaron/captcha"
"github.com/macaron-contrib/csrf" "github.com/go-macaron/csrf"
"github.com/macaron-contrib/i18n" "github.com/go-macaron/gzip"
"github.com/macaron-contrib/oauth2" "github.com/go-macaron/i18n"
"github.com/macaron-contrib/session" "github.com/go-macaron/session"
"github.com/macaron-contrib/toolbox" "github.com/go-macaron/toolbox"
"github.com/go-xorm/xorm"
"github.com/mcuadros/go-version"
"gopkg.in/ini.v1" "gopkg.in/ini.v1"
"gopkg.in/macaron.v1"
api "github.com/gogits/go-gogs-client" api "github.com/gogits/go-gogs-client"
@ -33,12 +35,11 @@ import (
"github.com/gogits/gogs/modules/auth" "github.com/gogits/gogs/modules/auth"
"github.com/gogits/gogs/modules/auth/apiv1" "github.com/gogits/gogs/modules/auth/apiv1"
"github.com/gogits/gogs/modules/avatar" "github.com/gogits/gogs/modules/avatar"
"github.com/gogits/gogs/modules/base"
"github.com/gogits/gogs/modules/bindata" "github.com/gogits/gogs/modules/bindata"
"github.com/gogits/gogs/modules/git"
"github.com/gogits/gogs/modules/log" "github.com/gogits/gogs/modules/log"
"github.com/gogits/gogs/modules/middleware" "github.com/gogits/gogs/modules/middleware"
"github.com/gogits/gogs/modules/setting" "github.com/gogits/gogs/modules/setting"
"github.com/gogits/gogs/modules/template"
"github.com/gogits/gogs/routers" "github.com/gogits/gogs/routers"
"github.com/gogits/gogs/routers/admin" "github.com/gogits/gogs/routers/admin"
"github.com/gogits/gogs/routers/api/v1" "github.com/gogits/gogs/routers/api/v1"
@ -55,8 +56,8 @@ var CmdWeb = cli.Command{
and it takes care of all the other things for you`, and it takes care of all the other things for you`,
Action: runWeb, Action: runWeb,
Flags: []cli.Flag{ Flags: []cli.Flag{
cli.StringFlag{"port, p", "3000", "Temporary port number to prevent conflict", ""}, stringFlag("port, p", "3000", "Temporary port number to prevent conflict"),
cli.StringFlag{"config, c", "custom/conf/app.ini", "Custom configuration file path", ""}, stringFlag("config, c", "custom/conf/app.ini", "Custom configuration file path"),
}, },
} }
@ -69,7 +70,7 @@ type VerChecker struct {
// checkVersion checks if binary matches the version of templates files. // checkVersion checks if binary matches the version of templates files.
func checkVersion() { func checkVersion() {
// Templates. // Templates.
data, err := ioutil.ReadFile(path.Join(setting.StaticRootPath, "templates/.VERSION")) data, err := ioutil.ReadFile(setting.StaticRootPath + "/templates/.VERSION")
if err != nil { if err != nil {
log.Fatal(4, "Fail to read 'templates/.VERSION': %v", err) log.Fatal(4, "Fail to read 'templates/.VERSION': %v", err)
} }
@ -79,18 +80,19 @@ func checkVersion() {
// Check dependency version. // Check dependency version.
checkers := []VerChecker{ checkers := []VerChecker{
{"github.com/go-xorm/xorm", func() string { return xorm.Version }, "0.4.4.1029"},
{"github.com/Unknwon/macaron", macaron.Version, "0.5.4"}, {"github.com/Unknwon/macaron", macaron.Version, "0.5.4"},
{"github.com/macaron-contrib/binding", binding.Version, "0.0.6"}, {"github.com/go-macaron/binding", binding.Version, "0.1.0"},
{"github.com/macaron-contrib/cache", cache.Version, "0.0.7"}, {"github.com/go-macaron/cache", cache.Version, "0.1.2"},
{"github.com/macaron-contrib/csrf", csrf.Version, "0.0.3"}, {"github.com/go-macaron/csrf", csrf.Version, "0.0.3"},
{"github.com/macaron-contrib/i18n", i18n.Version, "0.0.7"}, {"github.com/go-macaron/i18n", i18n.Version, "0.0.7"},
{"github.com/macaron-contrib/session", session.Version, "0.1.6"}, {"github.com/go-macaron/session", session.Version, "0.1.6"},
{"gopkg.in/ini.v1", ini.Version, "1.2.0"}, {"github.com/go-macaron/toolbox", toolbox.Version, "0.1.0"},
{"gopkg.in/ini.v1", ini.Version, "1.3.4"},
} }
for _, c := range checkers { for _, c := range checkers {
ver := strings.Join(strings.Split(c.Version(), ".")[:3], ".") if !version.Compare(c.Version(), c.Expected, ">=") {
if git.MustParseVersion(ver).LessThan(git.MustParseVersion(c.Expected)) { log.Fatal(4, "Package '%s' version is too old(%s -> %s), did you forget to update?", c.ImportPath, c.Version(), c.Expected)
log.Fatal(4, "Package '%s' version is too old(%s -> %s), did you forget to update?", c.ImportPath, ver, c.Expected)
} }
} }
} }
@ -98,10 +100,12 @@ func checkVersion() {
// newMacaron initializes Macaron instance. // newMacaron initializes Macaron instance.
func newMacaron() *macaron.Macaron { func newMacaron() *macaron.Macaron {
m := macaron.New() m := macaron.New()
m.Use(macaron.Logger()) if !setting.DisableRouterLog {
m.Use(macaron.Logger())
}
m.Use(macaron.Recovery()) m.Use(macaron.Recovery())
if setting.EnableGzip { if setting.EnableGzip {
m.Use(macaron.Gziper()) m.Use(gzip.Gziper())
} }
if setting.Protocol == setting.FCGI { if setting.Protocol == setting.FCGI {
m.SetURLPrefix(setting.AppSubUrl) m.SetURLPrefix(setting.AppSubUrl)
@ -109,19 +113,19 @@ func newMacaron() *macaron.Macaron {
m.Use(macaron.Static( m.Use(macaron.Static(
path.Join(setting.StaticRootPath, "public"), path.Join(setting.StaticRootPath, "public"),
macaron.StaticOptions{ macaron.StaticOptions{
SkipLogging: !setting.DisableRouterLog, SkipLogging: setting.DisableRouterLog,
}, },
)) ))
m.Use(macaron.Static( m.Use(macaron.Static(
setting.AvatarUploadPath, setting.AvatarUploadPath,
macaron.StaticOptions{ macaron.StaticOptions{
Prefix: "avatars", Prefix: "avatars",
SkipLogging: !setting.DisableRouterLog, SkipLogging: setting.DisableRouterLog,
}, },
)) ))
m.Use(macaron.Renderer(macaron.RenderOptions{ m.Use(macaron.Renderer(macaron.RenderOptions{
Directory: path.Join(setting.StaticRootPath, "templates"), Directory: path.Join(setting.StaticRootPath, "templates"),
Funcs: []template.FuncMap{base.TemplateFuncs}, Funcs: []gotmpl.FuncMap{template.Funcs},
IndentJSON: macaron.Env != macaron.PROD, IndentJSON: macaron.Env != macaron.PROD,
})) }))
@ -164,13 +168,6 @@ func newMacaron() *macaron.Macaron {
}, },
}, },
})) }))
// OAuth 2.
if setting.OauthService != nil {
for _, info := range setting.OauthService.OauthInfos {
m.Use(oauth2.NewOAuth2Provider(info.Options, info.AuthUrl, info.TokenUrl))
}
}
m.Use(middleware.Contexter()) m.Use(middleware.Contexter())
return m return m
} }
@ -195,15 +192,11 @@ func runWeb(ctx *cli.Context) {
// Routers. // Routers.
m.Get("/", ignSignIn, routers.Home) m.Get("/", ignSignIn, routers.Home)
m.Get("/explore", ignSignIn, routers.Explore) m.Get("/explore", ignSignIn, routers.Explore)
m.Combo("/install", routers.InstallInit). m.Combo("/install", routers.InstallInit).Get(routers.Install).
Get(routers.Install).
Post(bindIgnErr(auth.InstallForm{}), routers.InstallPost) Post(bindIgnErr(auth.InstallForm{}), routers.InstallPost)
m.Group("", func() { m.Get("/^:type(issues|pulls)$", reqSignIn, user.Issues)
m.Get("/pulls", user.Pulls)
m.Get("/issues", user.Issues)
}, reqSignIn)
// API. // ***** START: API *****
// FIXME: custom form error response. // FIXME: custom form error response.
m.Group("/api", func() { m.Group("/api", func() {
m.Group("/v1", func() { m.Group("/v1", func() {
@ -219,55 +212,79 @@ func runWeb(ctx *cli.Context) {
m.Get("", v1.GetUserInfo) m.Get("", v1.GetUserInfo)
m.Group("/tokens", func() { m.Group("/tokens", func() {
m.Combo("").Get(v1.ListAccessTokens).Post(bind(v1.CreateAccessTokenForm{}), v1.CreateAccessToken) m.Combo("").Get(v1.ListAccessTokens).
Post(bind(v1.CreateAccessTokenForm{}), v1.CreateAccessToken)
}, middleware.ApiReqBasicAuth()) }, middleware.ApiReqBasicAuth())
}) })
}) })
// Repositories. // Repositories.
m.Combo("/user/repos", middleware.ApiReqToken()).Get(v1.ListMyRepos).Post(bind(api.CreateRepoOption{}), v1.CreateRepo) m.Combo("/user/repos", middleware.ApiReqToken()).Get(v1.ListMyRepos).
Post(bind(api.CreateRepoOption{}), v1.CreateRepo)
m.Post("/org/:org/repos", middleware.ApiReqToken(), bind(api.CreateRepoOption{}), v1.CreateOrgRepo) m.Post("/org/:org/repos", middleware.ApiReqToken(), bind(api.CreateRepoOption{}), v1.CreateOrgRepo)
m.Group("/repos", func() { m.Group("/repos", func() {
m.Get("/search", v1.SearchRepos) m.Get("/search", v1.SearchRepos)
})
m.Group("/repos", func() {
m.Post("/migrate", bindIgnErr(auth.MigrateRepoForm{}), v1.MigrateRepo) m.Post("/migrate", bindIgnErr(auth.MigrateRepoForm{}), v1.MigrateRepo)
m.Combo("/:username/:reponame").Get(v1.GetRepo).
Delete(v1.DeleteRepo)
m.Group("/:username/:reponame", func() { m.Group("/:username/:reponame", func() {
m.Combo("/hooks").Get(v1.ListRepoHooks).Post(bind(api.CreateHookOption{}), v1.CreateRepoHook) m.Combo("/hooks").Get(v1.ListRepoHooks).
Post(bind(api.CreateHookOption{}), v1.CreateRepoHook)
m.Patch("/hooks/:id:int", bind(api.EditHookOption{}), v1.EditRepoHook) m.Patch("/hooks/:id:int", bind(api.EditHookOption{}), v1.EditRepoHook)
m.Get("/raw/*", middleware.RepoRef(), v1.GetRepoRawFile) m.Get("/raw/*", middleware.RepoRef(), v1.GetRepoRawFile)
}, middleware.ApiRepoAssignment(), middleware.ApiReqToken()) m.Get("/archive/*", v1.GetRepoArchive)
})
m.Group("/keys", func() {
m.Combo("").Get(v1.ListRepoDeployKeys).
Post(bind(api.CreateDeployKeyOption{}), v1.CreateRepoDeployKey)
m.Combo("/:id").Get(v1.GetRepoDeployKey).
Delete(v1.DeleteRepoDeploykey)
})
}, middleware.ApiRepoAssignment())
}, middleware.ApiReqToken())
m.Any("/*", func(ctx *middleware.Context) { m.Any("/*", func(ctx *middleware.Context) {
ctx.HandleAPI(404, "Page not found") ctx.Error(404)
}) })
}) })
}) }, ignSignIn)
// ***** END: API *****
// User. // ***** START: User *****
m.Group("/user", func() { m.Group("/user", func() {
m.Get("/login", user.SignIn) m.Get("/login", user.SignIn)
m.Post("/login", bindIgnErr(auth.SignInForm{}), user.SignInPost) m.Post("/login", bindIgnErr(auth.SignInForm{}), user.SignInPost)
m.Get("/info/:name", user.SocialSignIn)
m.Get("/sign_up", user.SignUp) m.Get("/sign_up", user.SignUp)
m.Post("/sign_up", bindIgnErr(auth.RegisterForm{}), user.SignUpPost) m.Post("/sign_up", bindIgnErr(auth.RegisterForm{}), user.SignUpPost)
m.Get("/reset_password", user.ResetPasswd) m.Get("/reset_password", user.ResetPasswd)
m.Post("/reset_password", user.ResetPasswdPost) m.Post("/reset_password", user.ResetPasswdPost)
}, reqSignOut) }, reqSignOut)
m.Group("/user/settings", func() { m.Group("/user/settings", func() {
m.Get("", user.Settings) m.Get("", user.Settings)
m.Post("", bindIgnErr(auth.UpdateProfileForm{}), user.SettingsPost) m.Post("", bindIgnErr(auth.UpdateProfileForm{}), user.SettingsPost)
m.Post("/avatar", binding.MultipartForm(auth.UploadAvatarForm{}), user.SettingsAvatar) m.Post("/avatar", binding.MultipartForm(auth.UploadAvatarForm{}), user.SettingsAvatar)
m.Get("/email", user.SettingsEmails) m.Combo("/email").Get(user.SettingsEmails).
m.Post("/email", bindIgnErr(auth.AddEmailForm{}), user.SettingsEmailPost) Post(bindIgnErr(auth.AddEmailForm{}), user.SettingsEmailPost)
m.Post("/email/delete", user.DeleteEmail)
m.Get("/password", user.SettingsPassword) m.Get("/password", user.SettingsPassword)
m.Post("/password", bindIgnErr(auth.ChangePasswordForm{}), user.SettingsPasswordPost) m.Post("/password", bindIgnErr(auth.ChangePasswordForm{}), user.SettingsPasswordPost)
m.Get("/ssh", user.SettingsSSHKeys) m.Combo("/ssh").Get(user.SettingsSSHKeys).
m.Post("/ssh", bindIgnErr(auth.AddSSHKeyForm{}), user.SettingsSSHKeysPost) Post(bindIgnErr(auth.AddSSHKeyForm{}), user.SettingsSSHKeysPost)
m.Get("/social", user.SettingsSocial) m.Post("/ssh/delete", user.DeleteSSHKey)
m.Combo("/applications").Get(user.SettingsApplications).Post(bindIgnErr(auth.NewAccessTokenForm{}), user.SettingsApplicationsPost) m.Combo("/applications").Get(user.SettingsApplications).
Post(bindIgnErr(auth.NewAccessTokenForm{}), user.SettingsApplicationsPost)
m.Post("/applications/delete", user.SettingsDeleteApplication)
m.Route("/delete", "GET,POST", user.SettingsDelete) m.Route("/delete", "GET,POST", user.SettingsDelete)
}, reqSignIn) }, reqSignIn, func(ctx *middleware.Context) {
ctx.Data["PageIsUserSettings"] = true
})
m.Group("/user", func() { m.Group("/user", func() {
// r.Get("/feeds", binding.Bind(auth.FeedsForm{}), user.Feeds) // r.Get("/feeds", binding.Bind(auth.FeedsForm{}), user.Feeds)
m.Any("/activate", user.Activate) m.Any("/activate", user.Activate)
@ -277,6 +294,7 @@ func runWeb(ctx *cli.Context) {
m.Post("/forget_password", user.ForgotPasswdPost) m.Post("/forget_password", user.ForgotPasswdPost)
m.Get("/logout", user.SignOut) m.Get("/logout", user.SignOut)
}) })
// ***** END: User *****
// Gravatar service. // Gravatar service.
avt := avatar.CacheServer("public/img/avatar/", "public/img/avatar_default.jpg") avt := avatar.CacheServer("public/img/avatar/", "public/img/avatar_default.jpg")
@ -285,6 +303,7 @@ func runWeb(ctx *cli.Context) {
adminReq := middleware.Toggle(&middleware.ToggleOptions{SignInRequire: true, AdminRequire: true}) adminReq := middleware.Toggle(&middleware.ToggleOptions{SignInRequire: true, AdminRequire: true})
// ***** START: Admin *****
m.Group("/admin", func() { m.Group("/admin", func() {
m.Get("", adminReq, admin.Dashboard) m.Get("", adminReq, admin.Dashboard)
m.Get("/config", admin.Config) m.Get("/config", admin.Config)
@ -293,7 +312,7 @@ func runWeb(ctx *cli.Context) {
m.Group("/users", func() { m.Group("/users", func() {
m.Get("", admin.Users) m.Get("", admin.Users)
m.Get("/new", admin.NewUser) m.Get("/new", admin.NewUser)
m.Post("/new", bindIgnErr(auth.RegisterForm{}), admin.NewUserPost) m.Post("/new", bindIgnErr(auth.AdminCrateUserForm{}), admin.NewUserPost)
m.Get("/:userid", admin.EditUser) m.Get("/:userid", admin.EditUser)
m.Post("/:userid", bindIgnErr(auth.AdminEditUserForm{}), admin.EditUserPost) m.Post("/:userid", bindIgnErr(auth.AdminEditUserForm{}), admin.EditUserPost)
m.Post("/:userid/delete", admin.DeleteUser) m.Post("/:userid/delete", admin.DeleteUser)
@ -311,8 +330,8 @@ func runWeb(ctx *cli.Context) {
m.Get("", admin.Authentications) m.Get("", admin.Authentications)
m.Get("/new", admin.NewAuthSource) m.Get("/new", admin.NewAuthSource)
m.Post("/new", bindIgnErr(auth.AuthenticationForm{}), admin.NewAuthSourcePost) m.Post("/new", bindIgnErr(auth.AuthenticationForm{}), admin.NewAuthSourcePost)
m.Get("/:authid", admin.EditAuthSource) m.Combo("/:authid").Get(admin.EditAuthSource).
m.Post("/:authid", bindIgnErr(auth.AuthenticationForm{}), admin.EditAuthSourcePost) Post(bindIgnErr(auth.AuthenticationForm{}), admin.EditAuthSourcePost)
m.Post("/:authid/delete", admin.DeleteAuthSource) m.Post("/:authid/delete", admin.DeleteAuthSource)
}) })
@ -321,31 +340,62 @@ func runWeb(ctx *cli.Context) {
m.Get("/:id:int/delete", admin.DeleteNotice) m.Get("/:id:int/delete", admin.DeleteNotice)
}) })
}, adminReq) }, adminReq)
// ***** END: Admin *****
m.Get("/:username", ignSignIn, user.Profile) m.Group("", func() {
m.Get("/:username", user.Profile)
m.Get("/attachments/:uuid", func(ctx *middleware.Context) {
attach, err := models.GetAttachmentByUUID(ctx.Params(":uuid"))
if err != nil {
if models.IsErrAttachmentNotExist(err) {
ctx.Error(404)
} else {
ctx.Handle(500, "GetAttachmentByUUID", err)
}
return
}
fr, err := os.Open(attach.LocalPath())
if err != nil {
ctx.Handle(500, "Open", err)
return
}
defer fr.Close()
ctx.Header().Set("Cache-Control", "public,max-age=86400")
// Fix #312. Attachments with , in their name are not handled correctly by Google Chrome.
// We must put the name in " manually.
if err = repo.ServeData(ctx, "\""+attach.Name+"\"", fr); err != nil {
ctx.Handle(500, "ServeData", err)
return
}
})
m.Post("/issues/attachments", repo.UploadIssueAttachment)
}, ignSignIn)
if macaron.Env == macaron.DEV { if macaron.Env == macaron.DEV {
m.Get("/template/*", dev.TemplatePreview) m.Get("/template/*", dev.TemplatePreview)
} }
reqAdmin := middleware.RequireAdmin() reqRepoAdmin := middleware.RequireRepoAdmin()
// Organization. // ***** START: Organization *****
m.Group("/org", func() { m.Group("/org", func() {
m.Get("/create", org.Create) m.Get("/create", org.Create)
m.Post("/create", bindIgnErr(auth.CreateOrgForm{}), org.CreatePost) m.Post("/create", bindIgnErr(auth.CreateOrgForm{}), org.CreatePost)
m.Group("/:org", func() { m.Group("/:org", func() {
m.Get("/dashboard", user.Dashboard) m.Get("/dashboard", user.Dashboard)
m.Get("/^:type(issues|pulls)$", user.Issues)
m.Get("/members", org.Members) m.Get("/members", org.Members)
m.Get("/members/action/:action", org.MembersAction) m.Get("/members/action/:action", org.MembersAction)
m.Get("/teams", org.Teams) m.Get("/teams", org.Teams)
m.Get("/teams/:team", org.TeamMembers) m.Get("/teams/:team", org.TeamMembers)
m.Get("/teams/:team/repositories", org.TeamRepositories) m.Get("/teams/:team/repositories", org.TeamRepositories)
m.Get("/teams/:team/action/:action", org.TeamsAction) m.Route("/teams/:team/action/:action", "GET,POST", org.TeamsAction)
m.Get("/teams/:team/action/repo/:action", org.TeamsRepoAction) m.Route("/teams/:team/action/repo/:action", "GET,POST", org.TeamsRepoAction)
}, middleware.OrgAssignment(true, true)) }, middleware.OrgAssignment(true))
m.Group("/:org", func() { m.Group("/:org", func() {
m.Get("/teams/new", org.NewTeam) m.Get("/teams/new", org.NewTeam)
@ -355,114 +405,165 @@ func runWeb(ctx *cli.Context) {
m.Post("/teams/:team/delete", org.DeleteTeam) m.Post("/teams/:team/delete", org.DeleteTeam)
m.Group("/settings", func() { m.Group("/settings", func() {
m.Get("", org.Settings) m.Combo("").Get(org.Settings).
m.Post("", bindIgnErr(auth.UpdateOrgSettingForm{}), org.SettingsPost) Post(bindIgnErr(auth.UpdateOrgSettingForm{}), org.SettingsPost)
m.Get("/hooks", org.SettingsHooks) m.Post("/avatar", binding.MultipartForm(auth.UploadAvatarForm{}), org.SettingsAvatar)
m.Get("/hooks/new", repo.WebHooksNew)
m.Post("/hooks/gogs/new", bindIgnErr(auth.NewWebhookForm{}), repo.WebHooksNewPost) m.Group("/hooks", func() {
m.Post("/hooks/slack/new", bindIgnErr(auth.NewSlackHookForm{}), repo.SlackHooksNewPost) m.Get("", org.Webhooks)
m.Get("/hooks/:id", repo.WebHooksEdit) m.Post("/delete", org.DeleteWebhook)
m.Post("/hooks/gogs/:id", bindIgnErr(auth.NewWebhookForm{}), repo.WebHooksEditPost) m.Get("/:type/new", repo.WebhooksNew)
m.Post("/hooks/slack/:id", bindIgnErr(auth.NewSlackHookForm{}), repo.SlackHooksEditPost) m.Post("/gogs/new", bindIgnErr(auth.NewWebhookForm{}), repo.WebHooksNewPost)
m.Post("/slack/new", bindIgnErr(auth.NewSlackHookForm{}), repo.SlackHooksNewPost)
m.Get("/:id", repo.WebHooksEdit)
m.Post("/gogs/:id", bindIgnErr(auth.NewWebhookForm{}), repo.WebHooksEditPost)
m.Post("/slack/:id", bindIgnErr(auth.NewSlackHookForm{}), repo.SlackHooksEditPost)
})
m.Route("/delete", "GET,POST", org.SettingsDelete) m.Route("/delete", "GET,POST", org.SettingsDelete)
}) })
m.Route("/invitations/new", "GET,POST", org.Invitation) m.Route("/invitations/new", "GET,POST", org.Invitation)
}, middleware.OrgAssignment(true, true, true)) }, middleware.OrgAssignment(true, true))
}, reqSignIn) }, reqSignIn)
m.Group("/org", func() { // ***** END: Organization *****
m.Get("/:org", org.Home)
}, ignSignIn, middleware.OrgAssignment(true))
// Repository. // ***** START: Repository *****
m.Group("/repo", func() { m.Group("/repo", func() {
m.Get("/create", repo.Create) m.Get("/create", repo.Create)
m.Post("/create", bindIgnErr(auth.CreateRepoForm{}), repo.CreatePost) m.Post("/create", bindIgnErr(auth.CreateRepoForm{}), repo.CreatePost)
m.Get("/migrate", repo.Migrate) m.Get("/migrate", repo.Migrate)
m.Post("/migrate", bindIgnErr(auth.MigrateRepoForm{}), repo.MigratePost) m.Post("/migrate", bindIgnErr(auth.MigrateRepoForm{}), repo.MigratePost)
m.Get("/fork", repo.Fork) m.Combo("/fork/:repoid").Get(repo.Fork).
m.Post("/fork", bindIgnErr(auth.CreateRepoForm{}), repo.ForkPost) Post(bindIgnErr(auth.CreateRepoForm{}), repo.ForkPost)
}, reqSignIn) }, reqSignIn)
m.Group("/:username/:reponame", func() { m.Group("/:username/:reponame", func() {
m.Get("/settings", repo.Settings)
m.Post("/settings", bindIgnErr(auth.RepoSettingForm{}), repo.SettingsPost)
m.Group("/settings", func() { m.Group("/settings", func() {
m.Route("/collaboration", "GET,POST", repo.SettingsCollaboration) m.Combo("").Get(repo.Settings).
m.Get("/hooks", repo.Webhooks) Post(bindIgnErr(auth.RepoSettingForm{}), repo.SettingsPost)
m.Get("/hooks/new", repo.WebHooksNew) m.Route("/collaboration", "GET,POST", repo.Collaboration)
m.Post("/hooks/gogs/new", bindIgnErr(auth.NewWebhookForm{}), repo.WebHooksNewPost)
m.Post("/hooks/slack/new", bindIgnErr(auth.NewSlackHookForm{}), repo.SlackHooksNewPost) m.Group("/hooks", func() {
m.Get("/hooks/:id", repo.WebHooksEdit) m.Get("", repo.Webhooks)
m.Post("/hooks/gogs/:id", bindIgnErr(auth.NewWebhookForm{}), repo.WebHooksEditPost) m.Post("/delete", repo.DeleteWebhook)
m.Post("/hooks/slack/:id", bindIgnErr(auth.NewSlackHookForm{}), repo.SlackHooksEditPost) m.Get("/:type/new", repo.WebhooksNew)
m.Post("/gogs/new", bindIgnErr(auth.NewWebhookForm{}), repo.WebHooksNewPost)
m.Group("/hooks/git", func() { m.Post("/slack/new", bindIgnErr(auth.NewSlackHookForm{}), repo.SlackHooksNewPost)
m.Get("", repo.GitHooks) m.Get("/:id", repo.WebHooksEdit)
m.Get("/:name", repo.GitHooksEdit) m.Post("/gogs/:id", bindIgnErr(auth.NewWebhookForm{}), repo.WebHooksEditPost)
m.Post("/:name", repo.GitHooksEditPost) m.Post("/slack/:id", bindIgnErr(auth.NewSlackHookForm{}), repo.SlackHooksEditPost)
}, middleware.GitHookService())
m.Group("/git", func() {
m.Get("", repo.GitHooks)
m.Combo("/:name").Get(repo.GitHooksEdit).
Post(repo.GitHooksEditPost)
}, middleware.GitHookService())
})
m.Group("/keys", func() {
m.Combo("").Get(repo.DeployKeys).
Post(bindIgnErr(auth.AddSSHKeyForm{}), repo.DeployKeysPost)
m.Post("/delete", repo.DeleteDeployKey)
})
}, func(ctx *middleware.Context) {
ctx.Data["PageIsSettings"] = true
}) })
}, reqSignIn, middleware.RepoAssignment(true), reqAdmin) }, reqSignIn, middleware.RepoAssignment(true), reqRepoAdmin, middleware.RepoRef())
m.Group("/:username/:reponame", func() { m.Group("/:username/:reponame", func() {
m.Get("/action/:action", repo.Action) m.Get("/action/:action", repo.Action)
m.Group("/issues", func() { m.Group("/issues", func() {
m.Get("/new", repo.CreateIssue) m.Combo("/new").Get(repo.NewIssue).
m.Post("/new", bindIgnErr(auth.CreateIssueForm{}), repo.CreateIssuePost) Post(bindIgnErr(auth.CreateIssueForm{}), repo.NewIssuePost)
m.Post("/:index", bindIgnErr(auth.CreateIssueForm{}), repo.UpdateIssue)
m.Post("/:index/label", repo.UpdateIssueLabel) m.Combo("/:index/comments").Post(bindIgnErr(auth.CreateCommentForm{}), repo.NewComment)
m.Post("/:index/milestone", repo.UpdateIssueMilestone) m.Group("/:index", func() {
m.Post("/:index/assignee", repo.UpdateAssignee) m.Post("/label", repo.UpdateIssueLabel)
m.Get("/:index/attachment/:id", repo.IssueGetAttachment) m.Post("/milestone", repo.UpdateIssueMilestone)
m.Post("/labels/new", bindIgnErr(auth.CreateLabelForm{}), repo.NewLabel) m.Post("/assignee", repo.UpdateIssueAssignee)
m.Post("/labels/edit", bindIgnErr(auth.CreateLabelForm{}), repo.UpdateLabel) }, reqRepoAdmin)
m.Post("/labels/delete", repo.DeleteLabel)
m.Get("/milestones/new", repo.NewMilestone) m.Group("/:index", func() {
m.Post("/milestones/new", bindIgnErr(auth.CreateMilestoneForm{}), repo.NewMilestonePost) m.Post("/title", repo.UpdateIssueTitle)
m.Get("/milestones/:index/edit", repo.UpdateMilestone) m.Post("/content", repo.UpdateIssueContent)
m.Post("/milestones/:index/edit", bindIgnErr(auth.CreateMilestoneForm{}), repo.UpdateMilestonePost) })
m.Get("/milestones/:index/:action", repo.UpdateMilestone)
}) })
m.Post("/comments/:id", repo.UpdateCommentContent)
m.Post("/comment/:action", repo.Comment) m.Group("/labels", func() {
m.Post("/new", bindIgnErr(auth.CreateLabelForm{}), repo.NewLabel)
m.Post("/edit", bindIgnErr(auth.CreateLabelForm{}), repo.UpdateLabel)
m.Post("/delete", repo.DeleteLabel)
}, reqRepoAdmin)
m.Group("/milestones", func() {
m.Get("/new", repo.NewMilestone)
m.Post("/new", bindIgnErr(auth.CreateMilestoneForm{}), repo.NewMilestonePost)
m.Get("/:id/edit", repo.EditMilestone)
m.Post("/:id/edit", bindIgnErr(auth.CreateMilestoneForm{}), repo.EditMilestonePost)
m.Get("/:id/:action", repo.ChangeMilestonStatus)
m.Post("/delete", repo.DeleteMilestone)
}, reqRepoAdmin)
m.Group("/releases", func() { m.Group("/releases", func() {
m.Get("/new", repo.NewRelease) m.Get("/new", repo.NewRelease)
m.Post("/new", bindIgnErr(auth.NewReleaseForm{}), repo.NewReleasePost) m.Post("/new", bindIgnErr(auth.NewReleaseForm{}), repo.NewReleasePost)
m.Get("/edit/:tagname", repo.EditRelease) m.Get("/edit/:tagname", repo.EditRelease)
m.Post("/edit/:tagname", bindIgnErr(auth.EditReleaseForm{}), repo.EditReleasePost) m.Post("/edit/:tagname", bindIgnErr(auth.EditReleaseForm{}), repo.EditReleasePost)
}, middleware.RepoRef()) m.Post("/delete", repo.DeleteRelease)
}, reqRepoAdmin, middleware.RepoRef())
m.Combo("/compare/*").Get(repo.CompareAndPullRequest).
Post(bindIgnErr(auth.CreateIssueForm{}), repo.CompareAndPullRequestPost)
}, reqSignIn, middleware.RepoAssignment(true)) }, reqSignIn, middleware.RepoAssignment(true))
m.Group("/:username/:reponame", func() { m.Group("/:username/:reponame", func() {
m.Get("/releases", middleware.RepoRef(), repo.Releases) m.Group("", func() {
m.Get("/issues", repo.Issues) m.Get("/releases", repo.Releases)
m.Get("/issues/:index", repo.ViewIssue) m.Get("/^:type(issues|pulls)$", repo.RetrieveLabels, repo.Issues)
m.Get("/issues/milestones", repo.Milestones) m.Get("/labels/", repo.RetrieveLabels, repo.Labels)
m.Get("/pulls", repo.Pulls) m.Get("/milestones", repo.Milestones)
}, middleware.RepoRef(),
func(ctx *middleware.Context) {
ctx.Data["PageIsList"] = true
})
m.Get("/^:type(issues|pulls)$/:index", repo.ViewIssue)
m.Get("/branches", repo.Branches) m.Get("/branches", repo.Branches)
m.Get("/archive/*", repo.Download) m.Get("/archive/*", repo.Download)
m.Get("/issues2/", repo.Issues2)
m.Get("/pulls2/", repo.PullRequest2) m.Group("/pulls/:index", func() {
m.Get("/labels2/", repo.Labels2) m.Get("/commits", repo.ViewPullCommits)
m.Get("/milestone2/", repo.Milestones2) m.Get("/files", repo.ViewPullFiles)
m.Post("/merge", reqRepoAdmin, repo.MergePullRequest)
})
m.Group("", func() { m.Group("", func() {
m.Get("/src/*", repo.Home) m.Get("/src/*", repo.Home)
m.Get("/raw/*", repo.SingleDownload) m.Get("/raw/*", repo.SingleDownload)
m.Get("/commits/*", repo.RefCommits) m.Get("/commits/*", repo.RefCommits)
m.Get("/commit/*", repo.Diff) m.Get("/commit/*", repo.Diff)
m.Get("/stars", repo.Stars)
m.Get("/watchers", repo.Watchers)
m.Get("/forks", repo.Forks)
}, middleware.RepoRef()) }, middleware.RepoRef())
m.Get("/compare/:before([a-z0-9]+)...:after([a-z0-9]+)", repo.CompareDiff) m.Get("/compare/:before([a-z0-9]{40})...:after([a-z0-9]{40})", repo.CompareDiff)
}, ignSignIn, middleware.RepoAssignment(true)) }, ignSignIn, middleware.RepoAssignment(true))
m.Group("/:username", func() { m.Group("/:username", func() {
m.Get("/:reponame", ignSignIn, middleware.RepoAssignment(true, true), middleware.RepoRef(), repo.Home) m.Group("/:reponame", func() {
m.Any("/:reponame/*", ignSignInAndCsrf, repo.Http) m.Get("", repo.Home)
m.Get("\\.git$", repo.Home)
}, ignSignIn, middleware.RepoAssignment(true, true), middleware.RepoRef())
m.Group("/:reponame", func() {
m.Any("/*", ignSignInAndCsrf, repo.HTTP)
m.Head("/tasks/trigger", repo.TriggerTask)
})
}) })
// ***** END: Repository *****
// robots.txt // robots.txt
m.Get("/robots.txt", func(ctx *middleware.Context) { m.Get("/robots.txt", func(ctx *middleware.Context) {

7
conf/README

@ -1,7 +0,0 @@
Execute following command in ROOT directory when anything is changed:
$ go-bindata -o=modules/bindata/bindata.go -ignore="\\.DS_Store|README" -pkg=bindata conf/...
Add -debug flag to make life easier in development(somehow isn't working):
$ go-bindata -debug -o=modules/bindata/bindata.go -ignore="\\.DS_Store|README" -pkg=bindata conf/...

7
conf/README.md

@ -0,0 +1,7 @@
Execute following command in ROOT directory when anything is changed:
$ go-bindata -o=modules/bindata/bindata.go -ignore="\\.DS_Store|README.md" -pkg=bindata conf/...
Add -debug flag to make life easier in development(somehow isn't working):
$ go-bindata -debug -o=modules/bindata/bindata.go -ignore="\\.DS_Store|README.md" -pkg=bindata conf/...

159
conf/app.ini

@ -11,6 +11,34 @@ RUN_MODE = dev
[repository] [repository]
ROOT = ROOT =
SCRIPT_TYPE = bash SCRIPT_TYPE = bash
; Default ANSI charset
ANSI_CHARSET =
; Force every new repository to be private
FORCE_PRIVATE = false
; Patch test queue length, make it as large as possible
PULL_REQUEST_QUEUE_LENGTH = 10000
[ui]
; Number of repositories that are showed in one explore page
EXPLORE_PAGING_NUM = 20
; Number of issues that are showed in one page
ISSUE_PAGING_NUM = 10
; Number of maximum commits showed in one activity feed
FEED_MAX_COMMIT_NUM = 5
[ui.admin]
; Number of users that are showed in one page
USER_PAGING_NUM = 50
; Number of repos that are showed in one page
REPO_PAGING_NUM = 50
; Number of notices that are showed in one page
NOTICE_PAGING_NUM = 50
; Number of organization that are showed in one page
ORG_PAGING_NUM = 50
[markdown]
; Enable hard line break extension
ENABLE_HARD_LINE_BREAK = false
[server] [server]
PROTOCOL = http PROTOCOL = http
@ -20,6 +48,8 @@ HTTP_ADDR =
HTTP_PORT = 3000 HTTP_PORT = 3000
; Disable SSH feature when not available ; Disable SSH feature when not available
DISABLE_SSH = false DISABLE_SSH = false
; Whether use builtin SSH server or not.
START_SSH_SERVER = false
SSH_PORT = 22 SSH_PORT = 22
; Disable CDN even in "prod" mode ; Disable CDN even in "prod" mode
OFFLINE_MODE = false OFFLINE_MODE = false
@ -51,7 +81,7 @@ USER = root
PASSWD = PASSWD =
; For "postgres" only, either "disable", "require" or "verify-full" ; For "postgres" only, either "disable", "require" or "verify-full"
SSL_MODE = disable SSL_MODE = disable
; For "sqlite3" only ; For "sqlite3" and "tidb"
PATH = data/gogs.db PATH = data/gogs.db
[admin] [admin]
@ -85,76 +115,56 @@ ENABLE_REVERSE_PROXY_AUTHENTICATION = false
ENABLE_REVERSE_PROXY_AUTO_REGISTRATION = false ENABLE_REVERSE_PROXY_AUTO_REGISTRATION = false
; Do not check minimum key size with corresponding type ; Do not check minimum key size with corresponding type
DISABLE_MINIMUM_KEY_SIZE_CHECK = false DISABLE_MINIMUM_KEY_SIZE_CHECK = false
; Enable captcha validation for registration
ENABLE_CAPTCHA = true
; used to filter keys which are too short
[service.minimum_key_sizes]
ED25519 = 256
ECDSA = 256
NTRU = 1087
MCE = 1702
McE = 1702
RSA = 1024
DSA = 1024
[webhook] [webhook]
; Cron task interval in minutes ; Hook task queue length
TASK_INTERVAL = 1 QUEUE_LENGTH = 1000
; Deliver timeout in seconds ; Deliver timeout in seconds
DELIVER_TIMEOUT = 5 DELIVER_TIMEOUT = 5
; Allow insecure certification ; Allow insecure certification
SKIP_TLS_VERIFY = false SKIP_TLS_VERIFY = false
; Number of history information in each page
PAGING_NUM = 10
[mailer] [mailer]
ENABLED = false ENABLED = false
; Buffer length of channel, keep it as it is if you don't know what it is. ; Buffer length of channel, keep it as it is if you don't know what it is.
SEND_BUFFER_LEN = 10 SEND_BUFFER_LEN = 100
; Name displayed in mail title ; Name displayed in mail title
SUBJECT = %(APP_NAME)s SUBJECT = %(APP_NAME)s
; Mail server ; Mail server
; Gmail: smtp.gmail.com:587 ; Gmail: smtp.gmail.com:587
; QQ: smtp.qq.com:25 ; QQ: smtp.qq.com:25
; Note, if the port ends with "465", SMTPS will be used. Using STARTTLS on port 587 is recommended per RFC 6409. If the server supports STARTTLS it will always be used. ; Note, if the port ends with "465", SMTPS will be used. Using STARTTLS on port 587 is recommended per RFC 6409. If the server supports STARTTLS it will always be used.
HOST = HOST =
; Disable HELO operation when hostname are different.
DISABLE_HELO =
; Custom hostname for HELO operation, default is from system.
HELO_HOSTNAME =
; Do not verify the certificate of the server. Only use this for self-signed certificates ; Do not verify the certificate of the server. Only use this for self-signed certificates
SKIP_VERIFY = SKIP_VERIFY =
; Use client certificate ; Use client certificate
USE_CERTIFICATE = false USE_CERTIFICATE = false
CERT_FILE = custom/mailer/cert.pem CERT_FILE = custom/mailer/cert.pem
KEY_FILE = custom/mailer/key.pem KEY_FILE = custom/mailer/key.pem
; Mail from address, RFC 5322. This can be just an email address, or the "Name" <email@example.com> format ; Mail from address, RFC 5322. This can be just an email address, or the `"Name" <email@example.com>` format
FROM = FROM =
; Mailer user name and password ; Mailer user name and password
USER = USER =
PASSWD = PASSWD =
[oauth]
ENABLED = false
[oauth.github]
ENABLED = false
CLIENT_ID =
CLIENT_SECRET =
SCOPES = https://api.github.com/user
AUTH_URL = https://github.com/login/oauth/authorize
TOKEN_URL = https://github.com/login/oauth/access_token
; Get client id and secret from
; https://console.developers.google.com/project
[oauth.google]
ENABLED = false
CLIENT_ID =
CLIENT_SECRET =
SCOPES = https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile
AUTH_URL = https://accounts.google.com/o/oauth2/auth
TOKEN_URL = https://accounts.google.com/o/oauth2/token
[oauth.qq]
ENABLED = false
CLIENT_ID =
CLIENT_SECRET =
SCOPES = get_user_info
; QQ 互联
AUTH_URL = https://graph.qq.com/oauth2.0/authorize
TOKEN_URL = https://graph.qq.com/oauth2.0/token
[oauth.weibo]
ENABLED = false
CLIENT_ID =
CLIENT_SECRET =
SCOPES = all
AUTH_URL = https://api.weibo.com/oauth2/authorize
TOKEN_URL = https://api.weibo.com/oauth2/access_token
[cache] [cache]
; Either "memory", "redis", or "memcache", default is "memory" ; Either "memory", "redis", or "memcache", default is "memory"
ADAPTER = memory ADAPTER = memory
@ -190,6 +200,7 @@ SESSION_LIFE_TIME = 86400
SERVICE = server SERVICE = server
AVATAR_UPLOAD_PATH = data/avatars AVATAR_UPLOAD_PATH = data/avatars
; Chinese users can choose "duoshuo" ; Chinese users can choose "duoshuo"
; or a custom avatar source, like: http://cn.gravatar.com/avatar/
GRAVATAR_SOURCE = gravatar GRAVATAR_SOURCE = gravatar
DISABLE_GRAVATAR = false DISABLE_GRAVATAR = false
@ -201,9 +212,9 @@ PATH = data/attachments
; One or more allowed types, e.g. image/jpeg|image/png ; One or more allowed types, e.g. image/jpeg|image/png
ALLOWED_TYPES = image/jpeg|image/png ALLOWED_TYPES = image/jpeg|image/png
; Max size of each file. Defaults to 32MB ; Max size of each file. Defaults to 32MB
MAX_SIZE = 32 MAX_SIZE = 4
; Max number of files per upload. Defaults to 10 ; Max number of files per upload. Defaults to 10
MAX_FILES = 10 MAX_FILES = 5
[time] [time]
; Specifies the format for fully outputed dates. Defaults to RFC1123 ; Specifies the format for fully outputed dates. Defaults to RFC1123
@ -272,24 +283,56 @@ DRIVER =
; Based on xorm, e.g.: root:root@localhost/gogs?charset=utf8 ; Based on xorm, e.g.: root:root@localhost/gogs?charset=utf8
CONN = CONN =
[cron]
; Enable running cron tasks periodically.
ENABLED = true
; Run cron tasks when Gogs starts.
RUN_AT_START = false
; Update mirrors
[cron.update_mirrors]
SCHEDULE = @every 1h
; Repository health check
[cron.repo_health_check]
SCHEDULE = @every 24h
; Arguments for command 'git fsck', e.g.: "--unreachable --tags"
; see more on http://git-scm.com/docs/git-fsck/1.7.5
ARGS =
; Check repository statistics
[cron.check_repo_stats]
RUN_AT_START = true
SCHEDULE = @every 24h
[git] [git]
MAX_GIT_DIFF_LINES = 10000 MAX_GIT_DIFF_LINES = 10000
; Arguments for command 'git gc', e.g.: "--aggressive --auto" ; Arguments for command 'git gc', e.g.: "--aggressive --auto"
; see more on http://git-scm.com/docs/git-gc/1.7.5 ; see more on http://git-scm.com/docs/git-gc/1.7.5
GC_ARGS = GC_ARGS =
; Git health check.
[git.fsck]
ENABLE = true
; Execution interval in hours. Default is 24.
INTERVAL = 24
; Arguments for command 'git fsck', e.g.: "--unreachable --tags"
; see more on http://git-scm.com/docs/git-fsck/1.7.5
ARGS =
[i18n] [i18n]
LANGS = en-US,zh-CN,zh-HK,de-DE,fr-FR,nl-NL,lv-LV,ru-RU,ja-JP,es-ES,pt-BR,pl-PL LANGS = en-US,zh-CN,zh-HK,de-DE,fr-FR,nl-NL,lv-LV,ru-RU,ja-JP,es-ES,pt-BR,pl-PL,bg-BG,it-IT
NAMES = English,简体中文,繁體中文,Deutsch,Français,Nederlands,Latviešu,Русский,日本语,Español,Português,Polski NAMES = English,简体中文,繁體中文,Deutsch,Français,Nederlands,Latviešu,Русский,日本語,Español,Português do Brasil,Polski,български,Italiano
; Used for datetimepicker
[i18n.datelang]
en-US = en
zh-CN = zh
zh-HK = zh-TW
de-DE = de
fr-FR = fr
nl-NL = nl
lv-LV = lv
ru-RU = ru
ja-JP = ja
es-ES = es
pt-BR = pt-BR
pl-PL = pl
bg-BG = bg
it-IT = it
[other] [other]
SHOW_FOOTER_BRANDING = false SHOW_FOOTER_BRANDING = false
; Show version information about gogs and go in the footer
SHOW_FOOTER_VERSION = true

11
conf/gitignore/Actionscript

@ -0,0 +1,11 @@
# Build and Release Folders
bin/
bin-debug/
bin-release/
# Other files and folders
.settings/
# Project files, i.e. `.project`, `.actionScriptProperties` and `.flexProperties`
# should NOT be excluded as they contain compiler settings and other important
# information for Eclipse / Flash Builder.

5
conf/gitignore/Ada

@ -0,0 +1,5 @@
# Object file
*.o
# Ada Library Information
*.ali

1
conf/gitignore/Agda

@ -0,0 +1 @@
*.agdai

11
conf/gitignore/Android

@ -20,4 +20,13 @@ build/
local.properties local.properties
# Proguard folder generated by Eclipse # Proguard folder generated by Eclipse
proguard/ proguard/
# Log Files
*.log
# Android Studio Navigation editor temp files
.navigation/
# Android Studio captures folder
captures/

3
conf/gitignore/Anjuta

@ -0,0 +1,3 @@
# Local configuration folder and symbol database
/.anjuta/
/.anjuta_sym_db.db

2
conf/gitignore/AppEngine

@ -0,0 +1,2 @@
# Google App Engine generated folder
appengine-generated/

3
conf/gitignore/AppceleratorTitanium

@ -0,0 +1,3 @@
# Build folder and log file
build/
build.log

13
conf/gitignore/ArchLinuxPackages

@ -0,0 +1,13 @@
*.tar
*.tar.*
*.jar
*.exe
*.msi
*.zip
*.tgz
*.log
*.log.*
*.sig
pkg/
src/

27
conf/gitignore/Archives

@ -0,0 +1,27 @@
# It's better to unpack these files and commit the raw source because
# git has its own built in compression methods.
*.7z
*.jar
*.rar
*.zip
*.gz
*.bzip
*.bz2
*.xz
*.lzma
*.cab
#packing-only formats
*.iso
*.tar
#package management formats
*.dmg
*.xpi
*.gem
*.egg
*.deb
*.rpm
*.msi
*.msm
*.msp

14
conf/gitignore/Autotools

@ -0,0 +1,14 @@
# http://www.gnu.org/software/automake
Makefile.in
# http://www.gnu.org/software/autoconf
/autom4te.cache
/aclocal.m4
/compile
/configure
/depcomp
/install-sh
/missing
/stamp-h1

4
conf/gitignore/BricxCC

@ -0,0 +1,4 @@
# Bricx Command Center IDE
# http://bricxcc.sourceforge.net
*.bak
*.sym

16
conf/gitignore/C

@ -1,10 +1,18 @@
# Object files # Object files
*.o *.o
*.ko *.ko
*.obj
*.elf
# Precompiled Headers
*.gch
*.pch
# Libraries # Libraries
*.lib *.lib
*.a *.a
*.la
*.lo
# Shared objects (inc. Windows DLLs) # Shared objects (inc. Windows DLLs)
*.dll *.dll
@ -15,4 +23,10 @@
# Executables # Executables
*.exe *.exe
*.out *.out
*.app *.app
*.i*86
*.x86_64
*.hex
# Debug files
*.dSYM/

2
conf/gitignore/C Sharp

@ -105,4 +105,4 @@ Generated_Code #added for RIA/Silverlight projects
# Visual Studio version. Backup files are not needed, because we have git ;-) # Visual Studio version. Backup files are not needed, because we have git ;-)
_UpgradeReport_Files/ _UpgradeReport_Files/
Backup*/ Backup*/
UpgradeLog*.XML UpgradeLog*.XML

15
conf/gitignore/C++

@ -2,12 +2,27 @@
*.slo *.slo
*.lo *.lo
*.o *.o
*.obj
# Precompiled Headers
*.gch
*.pch
# Compiled Dynamic libraries # Compiled Dynamic libraries
*.so *.so
*.dylib *.dylib
*.dll
# Fortran module files
*.mod
# Compiled Static libraries # Compiled Static libraries
*.lai *.lai
*.la *.la
*.a *.a
*.lib
# Executables
*.exe
*.out
*.app

12
conf/gitignore/CFWheels

@ -0,0 +1,12 @@
# unpacked plugin folders
plugins/**/*
# files directory where uploads go
files
# DBMigrate plugin: generated SQL
db/sql
# AssetBundler plugin: generated bundles
javascripts/bundles
stylesheets/bundles

6
conf/gitignore/CMake

@ -0,0 +1,6 @@
CMakeCache.txt
CMakeFiles
CMakeScripts
Makefile
cmake_install.cmake
install_manifest.txt

6
conf/gitignore/CUDA

@ -0,0 +1,6 @@
*.i
*.ii
*.gpu
*.ptx
*.cubin
*.fatbin

4
conf/gitignore/CVS

@ -0,0 +1,4 @@
/CVS/*
*/CVS/*
.cvsignore
*/.cvsignore

13
conf/gitignore/CakePHP

@ -0,0 +1,13 @@
# CakePHP 3
/vendor/*
/config/app.php
/tmp/*
/logs/*
# CakePHP 2
/app/tmp/*
/app/Config/core.php
/app/Config/database.php
/vendors/*

9
conf/gitignore/ChefCookbook

@ -0,0 +1,9 @@
.vagrant
/cookbooks
# Bundler
bin/*
.bundle/*
.kitchen/
.kitchen.local.yml

3
conf/gitignore/Cloud9

@ -0,0 +1,3 @@
# Cloud9 IDE - http://c9.io
.c9revisions
.c9

6
conf/gitignore/CodeIgniter

@ -0,0 +1,6 @@
*/config/development
*/logs/log-*.php
!*/logs/index.html
*/cache/*
!*/cache/index.html
!*/cache/.htaccess

3
conf/gitignore/CodeKit

@ -0,0 +1,3 @@
# General CodeKit files to ignore
config.codekit
/min

3
conf/gitignore/CommonLisp

@ -0,0 +1,3 @@
*.FASL
*.fasl
*.lisp-temp

6
conf/gitignore/Composer

@ -0,0 +1,6 @@
composer.phar
vendor/
# Commit your application's lock file http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file
# You may choose to ignore a library lock file http://getcomposer.org/doc/02-libraries.md#lock-file
# composer.lock

3
conf/gitignore/Concrete5

@ -0,0 +1,3 @@
config/site.php
files/cache/*
files/tmp/*

3
conf/gitignore/Coq

@ -0,0 +1,3 @@
*.vo
*.glob
*.v.d

3
conf/gitignore/CraftCMS

@ -0,0 +1,3 @@
# Craft Storage (cache) [http://buildwithcraft.com/help/craft-storage-gitignore]
/craft/storage/*
!/craft/storage/logo/*

5
conf/gitignore/DM

@ -0,0 +1,5 @@
*.dmb
*.rsc
*.int
*.lk
*.zip

15
conf/gitignore/Dart

@ -0,0 +1,15 @@
# Don’t commit the following directories created by pub.
.buildlog
.pub/
build/
packages
.packages
# Or the files created by dart2js.
*.dart.js
*.js_
*.js.deps
*.js.map
# Include when developing application packages.
pubspec.lock

2
conf/gitignore/DartEditor

@ -0,0 +1,2 @@
.project
.buildlog

57
conf/gitignore/Delphi

@ -0,0 +1,57 @@
# Uncomment these types if you want even more clean repository. But be careful.
# It can make harm to an existing project source. Read explanations below.
#
# Resource files are binaries containing manifest, project icon and version info.
# They can not be viewed as text or compared by diff-tools. Consider replacing them with .rc files.
#*.res
#
# Type library file (binary). In old Delphi versions it should be stored.
# Since Delphi 2009 it is produced from .ridl file and can safely be ignored.
#*.tlb
#
# Diagram Portfolio file. Used by the diagram editor up to Delphi 7.
# Uncomment this if you are not using diagrams or use newer Delphi version.
#*.ddp
#
# Visual LiveBindings file. Added in Delphi XE2.
# Uncomment this if you are not using LiveBindings Designer.
#*.vlb
#
# Deployment Manager configuration file for your project. Added in Delphi XE2.
# Uncomment this if it is not mobile development and you do not use remote debug feature.
#*.deployproj
#
# Delphi compiler-generated binaries (safe to delete)
*.exe
*.dll
*.bpl
*.bpi
*.dcp
*.so
*.apk
*.drc
*.map
*.dres
*.rsm
*.tds
*.dcu
*.lib
# Delphi autogenerated files (duplicated info)
*.cfg
*Resource.rc
# Delphi local files (user-specific info)
*.local
*.identcache
*.projdata
*.tvsconfig
*.dsk
# Delphi history and backups
__history/
*.~*
# Castalia statistics file
*.stat

3
conf/gitignore/Dreamweaver

@ -0,0 +1,3 @@
# DW Dreamweaver added files
_notes
dwsync.xml

36
conf/gitignore/Drupal

@ -0,0 +1,36 @@
# Ignore configuration files that may contain sensitive information.
sites/*/*settings*.php
# Ignore paths that contain generated content.
files/
sites/*/files
sites/*/private
# Ignore default text files
robots.txt
/CHANGELOG.txt
/COPYRIGHT.txt
/INSTALL*.txt
/LICENSE.txt
/MAINTAINERS.txt
/UPGRADE.txt
/README.txt
sites/all/README.txt
sites/all/modules/README.txt
sites/all/themes/README.txt
# Ignore everything but the "sites" folder ( for non core developer )
.htaccess
web.config
authorize.php
cron.php
index.php
install.php
update.php
xmlrpc.php
/includes
/misc
/modules
/profiles
/scripts
/themes

4
conf/gitignore/EPiServer

@ -0,0 +1,4 @@
######################
## EPiServer Files
######################
*License.config

36
conf/gitignore/Eagle

@ -0,0 +1,36 @@
# Ignore list for Eagle, a PCB layout tool
# Backup files
*.s#?
*.b#?
*.l#?
# Eagle project file
# It contains a serial number and references to the file structure
# on your computer.
# comment the following line if you want to have your project file included.
eagle.epf
# CAM files
*.$$$
*.cmp
*.ly2
*.l15
*.sol
*.plc
*.stc
*.sts
*.crc
*.crs
*.dri
*.drl
*.gpi
*.pls
*.drd
*.drd.*
*.info
*.eps

39
conf/gitignore/Eclipse

@ -0,0 +1,39 @@
*.pydevproject
.metadata
.gradle
bin/
tmp/
*.tmp
*.bak
*.swp
*~.nib
local.properties
.settings/
.loadpath
# Eclipse Core
.project
# External tool builders
.externalToolBuilders/
# Locally stored "Eclipse launch configurations"
*.launch
# CDT-specific
.cproject
# JDT-specific (Eclipse Java Development Tools)
.classpath
# Java annotation processor (APT)
.factorypath
# PDT-specific
.buildpath
# sbteclipse plugin
.target
# TeXlipse plugin
.texlipse

2
conf/gitignore/EiffelStudio

@ -0,0 +1,2 @@
# The compilation directoy
EIFGENs

5
conf/gitignore/Elisp

@ -0,0 +1,5 @@
# Compiled
*.elc
# Packaging
.cask

4
conf/gitignore/Elixir

@ -0,0 +1,4 @@
/_build
/deps
erl_crash.dump
*.ez

32
conf/gitignore/Emacs

@ -0,0 +1,32 @@
# -*- mode: gitignore; -*-
*~
\#*\#
/.emacs.desktop
/.emacs.desktop.lock
*.elc
auto-save-list
tramp
.\#*
# Org-mode
.org-id-locations
*_archive
# flymake-mode
*_flymake.*
# eshell files
/eshell/history
/eshell/lastdir
# elpa packages
/elpa/
# reftex files
*.rel
# AUCTeX auto folder
/auto/
# cask packages
.cask/

4
conf/gitignore/Ensime

@ -0,0 +1,4 @@
# Ensime specific
.ensime
.ensime_cache/
.ensime_lucene/

10
conf/gitignore/Erlang

@ -0,0 +1,10 @@
.eunit
deps
*.o
*.beam
*.plt
erl_crash.dump
ebin
rel/example_project
.concrete/DEV_MODE
.rebar

1
conf/gitignore/Espresso

@ -0,0 +1 @@
*.esproj

19
conf/gitignore/ExpressionEngine

@ -0,0 +1,19 @@
.DS_Store
# Images
images/avatars/
images/captchas/
images/smileys/
images/member_photos/
images/signature_attachments/
images/pm_attachments/
# For security do not publish the following files
system/expressionengine/config/database.php
system/expressionengine/config/config.php
# Caches
sized/
thumbs/
_thumbs/
*/expressionengine/cache/*

4
conf/gitignore/ExtJs

@ -0,0 +1,4 @@
.architect
bootstrap.json
build/
ext/

2
conf/gitignore/Fancy

@ -0,0 +1,2 @@
*.rbc
*.fyc

13
conf/gitignore/Finale

@ -0,0 +1,13 @@
*.bak
*.db
*.avi
*.pdf
*.ps
*.mid
*.midi
*.mp3
*.aif
*.wav
# Some versions of Finale have a bug and randomly save extra copies of
# the music source as "<Filename> copy.mus"
*copy.mus

3
conf/gitignore/FlexBuilder

@ -0,0 +1,3 @@
bin/
bin-debug/
bin-release/

4
conf/gitignore/ForceDotCom

@ -0,0 +1,4 @@
.project
.settings
salesforce.schema
Referenced Packages

2
conf/gitignore/FuelPHP

@ -0,0 +1,2 @@
fuel/app/logs/*/*/*
fuel/app/cache/*/*

28
conf/gitignore/GWT

@ -0,0 +1,28 @@
*.class
# Package Files #
*.jar
*.war
# gwt caches and compiled units #
war/gwt_bree/
gwt-unitCache/
# boilerplate generated classes #
.apt_generated/
# more caches and things from deploy #
war/WEB-INF/deploy/
war/WEB-INF/classes/
#compilation logs
.gwt/
#caching for already compiled files
gwt-unitCache/
#gwt junit compilation files
www-test/
#old GWT (1.5) created this dir
.gwt-tmp/

5
conf/gitignore/Gcov

@ -0,0 +1,5 @@
# gcc coverage testing tool files
*.gcno
*.gcda
*.gcov

16
conf/gitignore/GitBook

@ -0,0 +1,16 @@
# Node rules:
## Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
.grunt
## Dependency directory
## Commenting this out is preferred by some people, see
## https://docs.npmjs.com/misc/faq#should-i-check-my-node_modules-folder-into-git
node_modules
# Book build output
_book
# eBook build output
*.epub
*.mobi
*.pdf

24
conf/gitignore/Go

@ -0,0 +1,24 @@
# 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
*.test
*.prof

22
conf/gitignore/Google Go

@ -1,22 +0,0 @@
# 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

8
conf/gitignore/Gradle

@ -0,0 +1,8 @@
.gradle
build/
# Ignore Gradle GUI config
gradle-app.setting
# Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored)
!gradle-wrapper.jar

33
conf/gitignore/Grails

@ -0,0 +1,33 @@
# .gitignore for Grails 1.2 and 1.3
# Although this should work for most versions of grails, it is
# suggested that you use the "grails integrate-with --git" command
# to generate your .gitignore file.
# web application files
/web-app/WEB-INF/classes
# default HSQL database files for production mode
/prodDb.*
# general HSQL database files
*Db.properties
*Db.script
# logs
/stacktrace.log
/test/reports
/logs
# project release file
/*.war
# plugin release files
/*.zip
/plugin.xml
# older plugin install locations
/plugins
/web-app/plugins
# "temporary" build files
/target

16
conf/gitignore/Haskell

@ -0,0 +1,16 @@
dist
cabal-dev
*.o
*.hi
*.chi
*.chs.h
*.dyn_o
*.dyn_hi
.hpc
.hsenv
.cabal-sandbox/
cabal.sandbox.config
*.prof
*.aux
*.hp
.stack-work/

5
conf/gitignore/IGORPro

@ -0,0 +1,5 @@
# Avoid including Experiment files: they can be created and edited locally to test the ipf files
*.pxp
*.pxt
*.uxp
*.uxt

2
conf/gitignore/IPythonNotebook

@ -0,0 +1,2 @@
# Temporary data
.ipynb_checkpoints/

2
conf/gitignore/Idris

@ -0,0 +1,2 @@
*.ibc
*.o

13
conf/gitignore/JDeveloper

@ -0,0 +1,13 @@
# default application storage directory used by the IDE Performance Cache feature
.data/
# used for ADF styles caching
temp/
# default output directories
classes/
deploy/
javadoc/
# lock file, a part of Oracle Credential Store Framework
cwallet.sso.lck

2
conf/gitignore/Java

@ -9,4 +9,4 @@
*.ear *.ear
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid* hs_err_pid*

19
conf/gitignore/Jboss

@ -0,0 +1,19 @@
jboss/server/all/deploy/project.ext
jboss/server/default/deploy/project.ext
jboss/server/minimal/deploy/project.ext
jboss/server/all/log/*.log
jboss/server/all/tmp/**/*
jboss/server/all/data/**/*
jboss/server/all/work/**/*
jboss/server/default/log/*.log
jboss/server/default/tmp/**/*
jboss/server/default/data/**/*
jboss/server/default/work/**/*
jboss/server/minimal/log/*.log
jboss/server/minimal/tmp/**/*
jboss/server/minimal/data/**/*
jboss/server/minimal/work/**/*
# deployed package files #
*.DEPLOYED

3
conf/gitignore/Jekyll

@ -0,0 +1,3 @@
_site/
.sass-cache/
.jekyll-metadata

46
conf/gitignore/JetBrains

@ -0,0 +1,46 @@
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio
*.iml
## Directory-based project format:
.idea/
# if you remove the above rule, at least ignore the following:
# User-specific stuff:
# .idea/workspace.xml
# .idea/tasks.xml
# .idea/dictionaries
# Sensitive or high-churn files:
# .idea/dataSources.ids
# .idea/dataSources.xml
# .idea/sqlDataSources.xml
# .idea/dynamic.xml
# .idea/uiDesigner.xml
# Gradle:
# .idea/gradle.xml
# .idea/libraries
# Mongo Explorer plugin:
# .idea/mongoSettings.xml
## File-based project format:
*.ipr
*.iws
## Plugin-specific files:
# IntelliJ
/out/
# mpeltonen/sbt-idea plugin
.idea_modules/
# JIRA plugin
atlassian-ide-plugin.xml
# Crashlytics plugin (for Android Studio and IntelliJ)
com_crashlytics_export_strings.xml
crashlytics.properties
crashlytics-build.properties

525
conf/gitignore/Joomla

@ -0,0 +1,525 @@
/.gitignore
/.htaccess
/administrator/cache/*
/administrator/components/com_admin/*
/administrator/components/com_ajax/*
/administrator/components/com_tags/*
/administrator/components/com_banners/*
/administrator/components/com_cache/*
/administrator/components/com_postinstall/*
/administrator/components/com_joomlaupdate/*
/administrator/components/com_contenthistory/*
/administrator/components/com_categories/*
/administrator/components/com_checkin/*
/administrator/components/com_config/*
/administrator/components/com_contact/*
/administrator/components/com_content/*
/administrator/components/com_cpanel/*
/administrator/components/com_finder/*
/administrator/components/com_installer/*
/administrator/components/com_languages/*
/administrator/components/com_login/*
/administrator/components/com_media/*
/administrator/components/com_menus/*
/administrator/components/com_messages/*
/administrator/components/com_modules/*
/administrator/components/com_newsfeeds/*
/administrator/components/com_plugins/*
/administrator/components/com_redirect/*
/administrator/components/com_search/*
/administrator/components/com_templates/*
/administrator/components/com_users/*
/administrator/components/com_weblinks/*
/administrator/components/index.html
/administrator/help/*
/administrator/includes/*
/administrator/language/en-GB/en-GB.com_ajax.ini
/administrator/language/en-GB/en-GB.com_ajax.sys.ini
/administrator/language/en-GB/en-GB.com_contenthistory.ini
/administrator/language/en-GB/en-GB.com_contenthistory.sys.ini
/administrator/language/en-GB/en-GB.com_joomlaupdate.ini
/administrator/language/en-GB/en-GB.com_joomlaupdate.sys.ini
/administrator/language/en-GB/en-GB.com_postinstall.ini
/administrator/language/en-GB/en-GB.com_postinstall.sys.ini
/administrator/language/en-GB/en-GB.com_sitemapjen.sys.ini
/administrator/language/en-GB/en-GB.com_tags.ini
/administrator/language/en-GB/en-GB.com_tags.sys.ini
/administrator/language/en-GB/en-GB.mod_stats_admin.ini
/administrator/language/en-GB/en-GB.mod_stats_admin.sys.ini
/administrator/language/en-GB/en-GB.plg_authentication_cookie.ini
/administrator/language/en-GB/en-GB.plg_authentication_cookie.sys.ini
/administrator/language/en-GB/en-GB.plg_content_contact.ini
/administrator/language/en-GB/en-GB.plg_content_contact.sys.ini
/administrator/language/en-GB/en-GB.plg_content_finder.ini
/administrator/language/en-GB/en-GB.plg_content_finder.sys.ini
/administrator/language/en-GB/en-GB.plg_finder_categories.ini
/administrator/language/en-GB/en-GB.plg_finder_categories.sys.ini
/administrator/language/en-GB/en-GB.plg_finder_contacts.ini
/administrator/language/en-GB/en-GB.plg_finder_contacts.sys.ini
/administrator/language/en-GB/en-GB.plg_finder_content.ini
/administrator/language/en-GB/en-GB.plg_finder_content.sys.ini
/administrator/language/en-GB/en-GB.plg_finder_newsfeeds.sys.ini
/administrator/language/en-GB/en-GB.plg_finder_newsfeeds.ini
/administrator/language/en-GB/en-GB.plg_finder_tags.ini
/administrator/language/en-GB/en-GB.plg_finder_tags.sys.ini
/administrator/language/en-GB/en-GB.plg_finder_weblinks.ini
/administrator/language/en-GB/en-GB.plg_finder_weblinks.sys.ini
/administrator/language/en-GB/en-GB.plg_installer_webinstaller.ini
/administrator/language/en-GB/en-GB.plg_installer_webinstaller.sys.ini
/administrator/language/en-GB/en-GB.plg_quickicon_joomlaupdate.ini
/administrator/language/en-GB/en-GB.plg_quickicon_joomlaupdate.sys.ini
/administrator/language/en-GB/en-GB.plg_search_tags.ini
/administrator/language/en-GB/en-GB.plg_search_tags.sys.ini
/administrator/language/en-GB/en-GB.plg_system_languagecode.ini
/administrator/language/en-GB/en-GB.plg_system_languagecode.sys.ini
/administrator/language/en-GB/en-GB.plg_twofactorauth_totp.ini
/administrator/language/en-GB/en-GB.plg_twofactorauth_totp.sys.ini
/administrator/language/en-GB/en-GB.plg_twofactorauth_yubikey.ini
/administrator/language/en-GB/en-GB.plg_twofactorauth_yubikey.sys.ini
/administrator/language/en-GB/en-GB.tpl_isis.ini
/administrator/language/en-GB/en-GB.tpl_isis.sys.ini
/administrator/language/en-GB/install.xml
/administrator/language/en-GB/en-GB.com_admin.ini
/administrator/language/en-GB/en-GB.com_admin.sys.ini
/administrator/language/en-GB/en-GB.com_banners.ini
/administrator/language/en-GB/en-GB.com_banners.sys.ini
/administrator/language/en-GB/en-GB.com_cache.ini
/administrator/language/en-GB/en-GB.com_cache.sys.ini
/administrator/language/en-GB/en-GB.com_categories.ini
/administrator/language/en-GB/en-GB.com_categories.sys.ini
/administrator/language/en-GB/en-GB.com_checkin.ini
/administrator/language/en-GB/en-GB.com_checkin.sys.ini
/administrator/language/en-GB/en-GB.com_config.ini
/administrator/language/en-GB/en-GB.com_config.sys.ini
/administrator/language/en-GB/en-GB.com_contact.ini
/administrator/language/en-GB/en-GB.com_contact.sys.ini
/administrator/language/en-GB/en-GB.com_content.ini
/administrator/language/en-GB/en-GB.com_content.sys.ini
/administrator/language/en-GB/en-GB.com_cpanel.ini
/administrator/language/en-GB/en-GB.com_cpanel.sys.ini
/administrator/language/en-GB/en-GB.com_finder.ini
/administrator/language/en-GB/en-GB.com_finder.sys.ini
/administrator/language/en-GB/en-GB.com_installer.ini
/administrator/language/en-GB/en-GB.com_installer.sys.ini
/administrator/language/en-GB/en-GB.com_languages.ini
/administrator/language/en-GB/en-GB.com_languages.sys.ini
/administrator/language/en-GB/en-GB.com_login.ini
/administrator/language/en-GB/en-GB.com_login.sys.ini
/administrator/language/en-GB/en-GB.com_mailto.sys.ini
/administrator/language/en-GB/en-GB.com_media.ini
/administrator/language/en-GB/en-GB.com_media.sys.ini
/administrator/language/en-GB/en-GB.com_menus.ini
/administrator/language/en-GB/en-GB.com_menus.sys.ini
/administrator/language/en-GB/en-GB.com_messages.ini
/administrator/language/en-GB/en-GB.com_messages.sys.ini
/administrator/language/en-GB/en-GB.com_modules.ini
/administrator/language/en-GB/en-GB.com_modules.sys.ini
/administrator/language/en-GB/en-GB.com_newsfeeds.ini
/administrator/language/en-GB/en-GB.com_newsfeeds.sys.ini
/administrator/language/en-GB/en-GB.com_plugins.ini
/administrator/language/en-GB/en-GB.com_plugins.sys.ini
/administrator/language/en-GB/en-GB.com_redirect.ini
/administrator/language/en-GB/en-GB.com_redirect.sys.ini
/administrator/language/en-GB/en-GB.com_search.ini
/administrator/language/en-GB/en-GB.com_search.sys.ini
/administrator/language/en-GB/en-GB.com_templates.ini
/administrator/language/en-GB/en-GB.com_templates.sys.ini
/administrator/language/en-GB/en-GB.com_users.ini
/administrator/language/en-GB/en-GB.com_users.sys.ini
/administrator/language/en-GB/en-GB.com_weblinks.ini
/administrator/language/en-GB/en-GB.com_weblinks.sys.ini
/administrator/language/en-GB/en-GB.com_wrapper.ini
/administrator/language/en-GB/en-GB.com_wrapper.sys.ini
/administrator/language/en-GB/en-GB.ini
/administrator/language/en-GB/en-GB.lib_joomla.ini
/administrator/language/en-GB/en-GB.localise.php
/administrator/language/en-GB/en-GB.mod_custom.ini
/administrator/language/en-GB/en-GB.mod_custom.sys.ini
/administrator/language/en-GB/en-GB.mod_feed.ini
/administrator/language/en-GB/en-GB.mod_feed.sys.ini
/administrator/language/en-GB/en-GB.mod_latest.ini
/administrator/language/en-GB/en-GB.mod_latest.sys.ini
/administrator/language/en-GB/en-GB.mod_logged.ini
/administrator/language/en-GB/en-GB.mod_logged.sys.ini
/administrator/language/en-GB/en-GB.mod_login.ini
/administrator/language/en-GB/en-GB.mod_login.sys.ini
/administrator/language/en-GB/en-GB.mod_menu.ini
/administrator/language/en-GB/en-GB.mod_menu.sys.ini
/administrator/language/en-GB/en-GB.mod_multilangstatus.ini
/administrator/language/en-GB/en-GB.mod_multilangstatus.sys.ini
/administrator/language/en-GB/en-GB.mod_online.ini
/administrator/language/en-GB/en-GB.mod_online.sys.ini
/administrator/language/en-GB/en-GB.mod_popular.ini
/administrator/language/en-GB/en-GB.mod_popular.sys.ini
/administrator/language/en-GB/en-GB.mod_quickicon.ini
/administrator/language/en-GB/en-GB.mod_quickicon.sys.ini
/administrator/language/en-GB/en-GB.mod_status.ini
/administrator/language/en-GB/en-GB.mod_status.sys.ini
/administrator/language/en-GB/en-GB.mod_submenu.ini
/administrator/language/en-GB/en-GB.mod_submenu.sys.ini
/administrator/language/en-GB/en-GB.mod_title.ini
/administrator/language/en-GB/en-GB.mod_title.sys.ini
/administrator/language/en-GB/en-GB.mod_toolbar.ini
/administrator/language/en-GB/en-GB.mod_toolbar.sys.ini
/administrator/language/en-GB/en-GB.mod_unread.ini
/administrator/language/en-GB/en-GB.mod_unread.sys.ini
/administrator/language/en-GB/en-GB.mod_version.ini
/administrator/language/en-GB/en-GB.mod_version.sys.ini
/administrator/language/en-GB/en-GB.plg_authentication_example.ini
/administrator/language/en-GB/en-GB.plg_authentication_example.sys.ini
/administrator/language/en-GB/en-GB.plg_authentication_gmail.ini
/administrator/language/en-GB/en-GB.plg_authentication_gmail.sys.ini
/administrator/language/en-GB/en-GB.plg_authentication_joomla.ini
/administrator/language/en-GB/en-GB.plg_authentication_joomla.sys.ini
/administrator/language/en-GB/en-GB.plg_authentication_ldap.ini
/administrator/language/en-GB/en-GB.plg_authentication_ldap.sys.ini
/administrator/language/en-GB/en-GB.plg_captcha_recaptcha.ini
/administrator/language/en-GB/en-GB.plg_captcha_recaptcha.sys.ini
/administrator/language/en-GB/en-GB.plg_content_emailcloak.ini
/administrator/language/en-GB/en-GB.plg_content_emailcloak.sys.ini
/administrator/language/en-GB/en-GB.plg_content_geshi.ini
/administrator/language/en-GB/en-GB.plg_content_geshi.sys.ini
/administrator/language/en-GB/en-GB.plg_content_joomla.ini
/administrator/language/en-GB/en-GB.plg_content_joomla.sys.ini
/administrator/language/en-GB/en-GB.plg_content_loadmodule.ini
/administrator/language/en-GB/en-GB.plg_content_loadmodule.sys.ini
/administrator/language/en-GB/en-GB.plg_content_pagebreak.ini
/administrator/language/en-GB/en-GB.plg_content_pagebreak.sys.ini
/administrator/language/en-GB/en-GB.plg_content_pagenavigation.ini
/administrator/language/en-GB/en-GB.plg_content_pagenavigation.sys.ini
/administrator/language/en-GB/en-GB.plg_content_vote.ini
/administrator/language/en-GB/en-GB.plg_content_vote.sys.ini
/administrator/language/en-GB/en-GB.plg_editors_codemirror.ini
/administrator/language/en-GB/en-GB.plg_editors_codemirror.sys.ini
/administrator/language/en-GB/en-GB.plg_editors_none.ini
/administrator/language/en-GB/en-GB.plg_editors_none.sys.ini
/administrator/language/en-GB/en-GB.plg_editors_tinymce.ini
/administrator/language/en-GB/en-GB.plg_editors_tinymce.sys.ini
/administrator/language/en-GB/en-GB.plg_editors-xtd_article.ini
/administrator/language/en-GB/en-GB.plg_editors-xtd_article.sys.ini
/administrator/language/en-GB/en-GB.plg_editors-xtd_image.ini
/administrator/language/en-GB/en-GB.plg_editors-xtd_image.sys.ini
/administrator/language/en-GB/en-GB.plg_editors-xtd_pagebreak.ini
/administrator/language/en-GB/en-GB.plg_editors-xtd_pagebreak.sys.ini
/administrator/language/en-GB/en-GB.plg_editors-xtd_readmore.ini
/administrator/language/en-GB/en-GB.plg_editors-xtd_readmore.sys.ini
/administrator/language/en-GB/en-GB.plg_extension_joomla.ini
/administrator/language/en-GB/en-GB.plg_extension_joomla.sys.ini
/administrator/language/en-GB/en-GB.plg_quickicon_extensionupdate.ini
/administrator/language/en-GB/en-GB.plg_quickicon_extensionupdate.sys.ini
/administrator/language/en-GB/en-GB.plg_search_categories.ini
/administrator/language/en-GB/en-GB.plg_search_categories.sys.ini
/administrator/language/en-GB/en-GB.plg_search_contacts.ini
/administrator/language/en-GB/en-GB.plg_search_contacts.sys.ini
/administrator/language/en-GB/en-GB.plg_search_content.ini
/administrator/language/en-GB/en-GB.plg_search_content.sys.ini
/administrator/language/en-GB/en-GB.plg_search_newsfeeds.ini
/administrator/language/en-GB/en-GB.plg_search_newsfeeds.sys.ini
/administrator/language/en-GB/en-GB.plg_search_weblinks.ini
/administrator/language/en-GB/en-GB.plg_search_weblinks.sys.ini
/administrator/language/en-GB/en-GB.plg_system_cache.ini
/administrator/language/en-GB/en-GB.plg_system_cache.sys.ini
/administrator/language/en-GB/en-GB.plg_system_debug.ini
/administrator/language/en-GB/en-GB.plg_system_debug.sys.ini
/administrator/language/en-GB/en-GB.plg_system_highlight.ini
/administrator/language/en-GB/en-GB.plg_system_highlight.sys.ini
/administrator/language/en-GB/en-GB.plg_system_languagefilter.ini
/administrator/language/en-GB/en-GB.plg_system_languagefilter.sys.ini
/administrator/language/en-GB/en-GB.plg_system_log.ini
/administrator/language/en-GB/en-GB.plg_system_logout.ini
/administrator/language/en-GB/en-GB.plg_system_logout.sys.ini
/administrator/language/en-GB/en-GB.plg_system_log.sys.ini
/administrator/language/en-GB/en-GB.plg_system_p3p.ini
/administrator/language/en-GB/en-GB.plg_system_p3p.sys.ini
/administrator/language/en-GB/en-GB.plg_system_redirect.ini
/administrator/language/en-GB/en-GB.plg_system_redirect.sys.ini
/administrator/language/en-GB/en-GB.plg_system_remember.ini
/administrator/language/en-GB/en-GB.plg_system_remember.sys.ini
/administrator/language/en-GB/en-GB.plg_system_sef.ini
/administrator/language/en-GB/en-GB.plg_system_sef.sys.ini
/administrator/language/en-GB/en-GB.plg_user_contactcreator.ini
/administrator/language/en-GB/en-GB.plg_user_contactcreator.sys.ini
/administrator/language/en-GB/en-GB.plg_user_joomla.ini
/administrator/language/en-GB/en-GB.plg_user_joomla.sys.ini
/administrator/language/en-GB/en-GB.plg_user_profile.ini
/administrator/language/en-GB/en-GB.plg_user_profile.sys.ini
/administrator/language/en-GB/en-GB.tpl_bluestork.ini
/administrator/language/en-GB/en-GB.tpl_bluestork.sys.ini
/administrator/language/en-GB/en-GB.tpl_hathor.ini
/administrator/language/en-GB/en-GB.tpl_hathor.sys.ini
/administrator/language/en-GB/en-GB.xml
/administrator/language/en-GB/index.html
/administrator/language/overrides/*
/administrator/language/index.html
/administrator/manifests/*
/administrator/modules/mod_custom/*
/administrator/modules/mod_feed/*
/administrator/modules/mod_latest/*
/administrator/modules/mod_logged/*
/administrator/modules/mod_login/*
/administrator/modules/mod_menu/*
/administrator/modules/mod_multilangstatus/*
/administrator/modules/mod_online/*
/administrator/modules/mod_popular/*
/administrator/modules/mod_quickicon/*
/administrator/modules/mod_status/*
/administrator/modules/mod_submenu/*
/administrator/modules/mod_title/*
/administrator/modules/mod_toolbar/*
/administrator/modules/mod_unread/*
/administrator/modules/mod_version/*
/administrator/modules/mod_stats_admin/*
/administrator/modules/index.html
/administrator/templates/bluestork/*
/administrator/templates/isis/*
/administrator/templates/hathor/*
/administrator/templates/system/*
/administrator/templates/index.html
/administrator/index.php
/cache/*
/bin/*
/cli/*
/components/com_banners/*
/components/com_ajax/*
/components/com_config/*
/components/com_contenthistory/*
/components/com_tags/*
/components/com_contact/*
/components/com_content/*
/components/com_finder/*
/components/com_mailto/*
/components/com_media/*
/components/com_newsfeeds/*
/components/com_search/*
/components/com_users/*
/components/com_weblinks/*
/components/com_wrapper/*
/components/index.html
/images/banners/*
/images/sampledata/*
/images/joomla*
/images/index.html
/images/powered_by.png
/includes/*
/installation/*
/language/en-GB/en-GB.com_ajax.ini
/language/en-GB/en-GB.com_config.ini
/language/en-GB/en-GB.com_contact.ini
/language/en-GB/en-GB.com_finder.ini
/language/en-GB/en-GB.com_tags.ini
/language/en-GB/en-GB.finder_cli.ini
/language/en-GB/en-GB.lib_fof.sys.ini
/language/en-GB/en-GB.com_content.ini
/language/en-GB/en-GB.lib_idna_convert.sys.ini
/language/en-GB/en-GB.com_mailto.ini
/language/en-GB/en-GB.lib_joomla.sys.ini
/language/en-GB/en-GB.lib_phpass.sys.ini
/language/en-GB/en-GB.lib_phpmailer.sys.ini
/language/en-GB/en-GB.lib_phputf8.sys.ini
/language/en-GB/en-GB.lib_simplepie.sys.ini
/language/en-GB/en-GB.com_media.ini
/language/en-GB/en-GB.mod_finder.ini
/language/en-GB/en-GB.com_messages.ini
/language/en-GB/en-GB.mod_tags_popular.ini
/language/en-GB/en-GB.mod_tags_popular.sys.ini
/language/en-GB/en-GB.mod_tags_similar.ini
/language/en-GB/en-GB.mod_tags_similar.sys.ini
/language/en-GB/en-GB.mod_finder.sys.ini
/language/en-GB/en-GB.tpl_beez3.ini
/language/en-GB/en-GB.tpl_beez3.sys.ini
/language/en-GB/en-GB.com_newsfeeds.ini
/language/en-GB/en-GB.tpl_protostar.ini
/language/en-GB/en-GB.tpl_protostar.sys.ini
/language/en-GB/en-GB.com_search.ini
/language/en-GB/en-GB.com_users.ini
/language/en-GB/en-GB.com_weblinks.ini
/language/en-GB/en-GB.com_wrapper.ini
/language/en-GB/en-GB.files_joomla.sys.ini
/language/en-GB/en-GB.ini
/language/en-GB/en-GB.lib_joomla.ini
/language/en-GB/en-GB.localise.php
/language/en-GB/en-GB.mod_articles_archive.ini
/language/en-GB/en-GB.mod_articles_archive.sys.ini
/language/en-GB/en-GB.mod_articles_categories.ini
/language/en-GB/en-GB.mod_articles_categories.sys.ini
/language/en-GB/en-GB.mod_articles_category.ini
/language/en-GB/en-GB.mod_articles_category.sys.ini
/language/en-GB/en-GB.mod_articles_latest.ini
/language/en-GB/en-GB.mod_articles_latest.sys.ini
/language/en-GB/en-GB.mod_articles_news.ini
/language/en-GB/en-GB.mod_articles_news.sys.ini
/language/en-GB/en-GB.mod_articles_popular.ini
/language/en-GB/en-GB.mod_articles_popular.sys.ini
/language/en-GB/en-GB.mod_banners.ini
/language/en-GB/en-GB.mod_banners.sys.ini
/language/en-GB/en-GB.mod_breadcrumbs.ini
/language/en-GB/en-GB.mod_breadcrumbs.sys.ini
/language/en-GB/en-GB.mod_custom.ini
/language/en-GB/en-GB.mod_custom.sys.ini
/language/en-GB/en-GB.mod_feed.ini
/language/en-GB/en-GB.mod_feed.sys.ini
/language/en-GB/en-GB.mod_footer.ini
/language/en-GB/en-GB.mod_footer.sys.ini
/language/en-GB/en-GB.mod_languages.ini
/language/en-GB/en-GB.mod_languages.sys.ini
/language/en-GB/en-GB.mod_login.ini
/language/en-GB/en-GB.mod_login.sys.ini
/language/en-GB/en-GB.mod_menu.ini
/language/en-GB/en-GB.mod_menu.sys.ini
/language/en-GB/en-GB.mod_random_image.ini
/language/en-GB/en-GB.mod_random_image.sys.ini
/language/en-GB/en-GB.mod_related_items.ini
/language/en-GB/en-GB.mod_related_items.sys.ini
/language/en-GB/en-GB.mod_search.ini
/language/en-GB/en-GB.mod_search.sys.ini
/language/en-GB/en-GB.mod_stats.ini
/language/en-GB/en-GB.mod_stats.sys.ini
/language/en-GB/en-GB.mod_syndicate.ini
/language/en-GB/en-GB.mod_syndicate.sys.ini
/language/en-GB/en-GB.mod_users_latest.ini
/language/en-GB/en-GB.mod_users_latest.sys.ini
/language/en-GB/en-GB.mod_weblinks.ini
/language/en-GB/en-GB.mod_weblinks.sys.ini
/language/en-GB/en-GB.mod_whosonline.ini
/language/en-GB/en-GB.mod_whosonline.sys.ini
/language/en-GB/en-GB.mod_wrapper.ini
/language/en-GB/en-GB.mod_wrapper.sys.ini
/language/en-GB/en-GB.tpl_atomic.ini
/language/en-GB/en-GB.tpl_atomic.sys.ini
/language/en-GB/en-GB.tpl_beez_20.ini
/language/en-GB/en-GB.tpl_beez_20.sys.ini
/language/en-GB/en-GB.tpl_beez5.ini
/language/en-GB/en-GB.tpl_beez5.sys.ini
/language/en-GB/en-GB.xml
/language/en-GB/index.html
/language/en-GB/install.xml
/language/overrides/*
/language/index.html
/libraries/cms.php
/libraries/cms/*
/libraries/joomla/*
/libraries/phpmailer/*
/libraries/phputf8/*
/libraries/simplepie/*
/libraries/index.html
/libraries/import.php
/libraries/loader.php
/libraries/platform.php
/logs/*
/media/cms/*
/media/com_finder/*
/media/contacts/*
/media/editors/*
/media/mailto/*
/media/media/*
/media/mod_languages/*
/media/overrider/*
/media/plg_quickicon_extensionupdate/*
/media/plg_quickicon_joomlaupdate/*
/media/plg_system_highlight/*
/media/system/*
/media/index.html
/modules/mod_articles_archive/*
/modules/mod_articles_categories/*
/modules/mod_articles_category/*
/modules/mod_articles_latest/*
/modules/mod_articles_news/*
/modules/mod_articles_popular/*
/modules/mod_banners/*
/modules/mod_breadcrumbs/*
/modules/mod_custom/*
/modules/mod_feed/*
/modules/mod_finder/*
/modules/mod_footer/*
/modules/mod_languages/*
/modules/mod_login/*
/modules/mod_menu/*
/modules/mod_random_image/*
/modules/mod_related_items/*
/modules/mod_search/*
/modules/mod_stats/*
/modules/mod_syndicate/*
/modules/mod_users_latest/*
/modules/mod_weblinks/*
/modules/mod_whosonline/*
/modules/mod_wrapper/*
/modules/index.html
/plugins/authentication/example/*
/plugins/authentication/gmail/*
/plugins/authentication/joomla/*
/plugins/authentication/ldap/*
/plugins/authentication/index.html
/plugins/captcha/recaptcha/*
/plugins/captcha/index.html
/plugins/content/emailcloak/*
/plugins/content/example/*
/plugins/content/finder/*
/plugins/content/geshi/*
/plugins/content/joomla/*
/plugins/content/loadmodule/*
/plugins/content/pagebreak/*
/plugins/content/pagenavigation/*
/plugins/content/vote/*
/plugins/content/contact/*
/plugins/content/index.html
/plugins/editors/codemirror/*
/plugins/editors/none/*
/plugins/editors/tinymce/*
/plugins/editors/index.html
/plugins/editors-xtd/article/*
/plugins/editors-xtd/image/*
/plugins/editors-xtd/pagebreak/*
/plugins/editors-xtd/readmore/*
/plugins/editors-xtd/index.html
/plugins/extension/example/*
/plugins/extension/joomla/*
/plugins/extension/index.html
/plugins/finder/index.html
/plugins/finder/categories/*
/plugins/finder/contacts/*
/plugins/finder/content/*
/plugins/finder/newsfeeds/*
/plugins/finder/tags/*
/plugins/finder/weblinks/*
/plugins/installer/*
/plugins/quickicon/extensionupdate/*
/plugins/quickicon/joomlaupdate/*
/plugins/quickicon/index.html
/plugins/search/categories/*
/plugins/search/contacts/*
/plugins/search/content/*
/plugins/search/newsfeeds/*
/plugins/search/weblinks/*
/plugins/search/tags/*
/plugins/search/index.html
/plugins/system/cache/*
/plugins/system/debug/*
/plugins/system/highlight/*
/plugins/system/languagecode/*
/plugins/system/languagefilter/*
/plugins/system/log/*
/plugins/system/logout/*
/plugins/system/p3p/*
/plugins/system/redirect/*
/plugins/system/remember/*
/plugins/system/sef/*
/plugins/system/index.html
/plugins/twofactorauth/*
/plugins/user/contactcreator/*
/plugins/user/example/*
/plugins/user/joomla/*
/plugins/user/profile/*
/plugins/user/index.html
/plugins/index.html
/templates/atomic/*
/templates/beez3/*
/templates/beez_20/*
/templates/beez5/*
/templates/protostar/*
/templates/system/*
/templates/index.html
/tmp/*
/configuration.php
/index.php
/joomla.xml
/*.txt

2
conf/gitignore/KDevelop4

@ -0,0 +1,2 @@
*.kdev4
.kdev4/

3
conf/gitignore/Kate

@ -0,0 +1,3 @@
# Swap Files #
.*.kate-swp
.swp.*

13
conf/gitignore/KiCAD

@ -0,0 +1,13 @@
# For PCBs designed using KiCAD: http://www.kicad-pcb.org/
# Temporary files
*.000
*.bak
*.bck
*.kicad_pcb-bak
# Netlist files (exported from Eeschema)
*.net
# Autorouter files (exported from Pcbnew)
.dsn

2
conf/gitignore/Kohana

@ -0,0 +1,2 @@
application/cache/*
application/logs/*

16
conf/gitignore/LabVIEW

@ -0,0 +1,16 @@
# Libraries
*.lvlibp
*.llb
# Shared objects (inc. Windows DLLs)
*.dll
*.so
*.so.*
*.dylib
# Executables
*.exe
# Metadata
*.aliases
*.lvlps

4
conf/gitignore/Laravel

@ -0,0 +1,4 @@
/bootstrap/compiled.php
.env.*.php
.env.php
.env

30
conf/gitignore/Lazarus

@ -0,0 +1,30 @@
# Lazarus compiler-generated binaries (safe to delete)
*.exe
*.dll
*.so
*.dylib
*.lrs
*.res
*.compiled
*.dbg
*.ppu
*.o
*.or
*.a
# Lazarus autogenerated files (duplicated info)
*.rst
*.rsj
*.lrt
# Lazarus local files (user-specific info)
*.lps
# Lazarus backups and unit output folders.
# These can be changed by user in Lazarus/project options.
backup/
*.bak
lib/
# Application bundle for Mac OS
*.app/

12
conf/gitignore/Leiningen

@ -0,0 +1,12 @@
pom.xml
pom.xml.asc
*jar
/lib/
/classes/
/target/
/checkouts/
.lein-deps-sum
.lein-repl-history
.lein-plugins/
.lein-failures
.nrepl-port

21
conf/gitignore/LemonStand

@ -0,0 +1,21 @@
boot.php
index.php
install.php
/config/*
!/config/config.php
/controllers/*
/init/*
/logs/*
/phproad/*
/temp/*
/uploaded/*
/installer_files/*
/modules/backend/*
/modules/blog/*
/modules/cms/*
/modules/core/*
/modules/session/*
/modules/shop/*
/modules/system/*
/modules/users/*
# add content_*.php if you don't want erase client changes to content

2
conf/gitignore/LibreOffice

@ -0,0 +1,2 @@
# LibreOffice locks
.~lock.*#

6
conf/gitignore/Lilypond

@ -0,0 +1,6 @@
*.pdf
*.ps
*.midi
*.mid
*.log
*~

7
conf/gitignore/Linux

@ -0,0 +1,7 @@
*~
# KDE directory preferences
.directory
# Linux trash folder which might appear on any partition or disk
.Trash-*

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save