#  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
cache-manifest.cmf
*-min.html
*-min.js
*-min.css
*.b64
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

