#  Licensed to the Apache Software Foundation (ASF) under one
#  or more contributor license agreements.  See the NOTICE file
#  distributed with this work for additional information
#  regarding copyright ownership.  The ASF licenses this file
#  to you under the Apache License, Version 2.0 (the
#  "License"); you may not use this file except in compliance
#  with the License.  You may obtain a copy of the License at
#  
#    http://www.apache.org/licenses/LICENSE-2.0
#    
#  Unless required by applicable law or agreed to in writing,
#  software distributed under the License is distributed on an
#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
#  KIND, either express or implied.  See the License for the
#  specific language governing permissions and limitations
#  under the License.
  
# git-ls-files --others --exclude-from=.git/info/exclude
# Lines that start with '#' are comments.
# For a project mostly in C, the following would be a good set of
# exclude patterns (uncomment them if you want to use them):
# *.[oa]
# *~

# Generic ignores
target/
work/
tmp/
build/
*_build
.project
.cproject
.classpath
*.log
junit*.properties
surefire*.properties
.settings/
.deployables/
.wtpmodules/
.pydevproject
.buildpath
.svn/
.cvs/
.dotest/
*.la
*.lo
*.o
*.in
*.so
*.dylib
Makefile
.deps/
.libs/
m4/
*.m4
config.guess
config.sub
config.status
all.js
base.js
cache-manifest.cmf
*-min.html
*-ssi.html
*-min.js
*-min.css
*.b64
*.off
intro*.png
depcomp
install-sh
ltmain.sh
missing
stamp-h1
autom4te.cache/
deploy/
libtool
configure
config.h
Doxyfile
*.tar
*.tar.gz
*-bin/
*-src/
*_Proxy.cpp
*_Proxy.h
*_Wrapper.cpp
*_Wrapper.h
gmon.out
*~
*.swp
tags
doxygen
*.pyc
*.class
*.stamp
*.jar
*.prefix
*.crt
/*.patch
index.yaml
core
gen-cpp/

# Specific ignores
kernel-test
string-test
mem-test
hash-test
lambda-test
parallel-test
xml-test
xsd-test
atom-test
scheme-test
scheme-shell
json-test
client-test
memcache-test
curl-test
scdl-test
python-test
python-shell
jni-test
java-test
java-shell
script-test
axiom-test
axis2-test
qpid-test
xmpp-test
pgsql-test
pgsql-standby-test
tinycdb-test
curl-get
curl-connect
rss-test
scribe-cat
scribe-status
js-test
js-shell
file-test
test-start*
test-stop*
xml-element
element-xml
json-value
value-json
element-value
value-element
hosting/server/nuvem
hosting/server/lib
hosting/server/data/apps/*/nuvem
hosting/server/data/apps/*/lib
hosting/server/data/authn
chat-send
opencl-shell
opencl-test
patch-test

