#
# 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.
#
# Common
*.class
!.github/
!.gitignore
!.gitkeep
!.travis.yml
**/*.versionsBackup

# Eclipse
.classpath
.project
.settings/
.recommenders/
.factorypath
/.metadata/

# Intellij
.idea/
*.iml
*.iws
!/.idea/icon.png
!/.idea/vcs.xml

# NetBeans
nb-configuration.xml

# Mac
**/.DS_Store
.java-version

# VisualStudioCode artifacts
.vscode/

# Maven
log/
logs/
target/
target/dist/

# Python
venv/
eggs/
wheels/
*.pyc

# C/C++
inlong-tubemq/tubemq-client-twins/tubemq-client-cpp/build/
inlong-sdk/dataproxy-sdk-twins/dataproxy-sdk-cpp/build/
inlong-sdk/dataproxy-sdk-twins/dataproxy-sdk-cpp/release/bin/
# Gradle
.gradle

# Log
*.log

# Docker mysql storage
docker/docker-compose/mysql

# Directories for local debugging
## The connectors for loading to Flink job
/inlong-sort/connectors
## The plugins for submitting job to Flink cluster
/plugins
## The jar for parsing job info
/inlong-sort/sort-dist.jar
## The directory for load plugins by manager
/inlong-manager/plugins