# 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.

instructions.configure = \
    org.eclipse.equinox.p2.touchpoint.natives.remove(path:${installFolder}/eclipsec.exe);\
    org.eclipse.equinox.p2.touchpoint.natives.remove(path:${installFolder}/readme);\
    org.eclipse.equinox.p2.touchpoint.natives.remove(path:${installFolder}/notice.html);\
    org.eclipse.equinox.p2.touchpoint.natives.remove(path:${installFolder}/epl-v10.html);\
    org.eclipse.equinox.p2.touchpoint.natives.remove(path:${installFolder}/.eclipseproduct);\
    org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../../../../../../../../LICENSE.txt,target:${installFolder}/LICENSE.txt,overwrite:true);\
    org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../../../../../../../../NOTICE.txt,target:${installFolder}/NOTICE.txt,overwrite:true);\
    addRepository(type:0,location:http${#58}//directory.apache.org/studio/update/product,name:Apache Directory Studio);\
    addRepository(type:1,location:http${#58}//directory.apache.org/studio/update/product,name:Apache Directory Studio);

