#
#  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.
#
# This is a feature description
#
# A feature consists of variables and run mode dependent artifacts.
#

# Test our Sling extension commands, that add a bundle via the Sling installer
# (which requires commons.json and jcr-wrapper)
[feature name=crankstart.test.base]

[variables]
  felix.http.jetty.version=2.2.0

[artifacts]
  org.apache.felix/org.apache.felix.http.jetty/${felix.http.jetty.version}
  org.apache.felix/org.apache.felix.eventadmin/1.3.2
  org.apache.felix/org.apache.felix.scr/1.8.2
  org.apache.felix/org.apache.felix.metatype/1.0.10
  org.apache.sling/org.apache.sling.commons.osgi/2.2.0
  org.apache.sling/org.apache.sling.commons.log/2.1.2
  org.apache.felix/org.apache.felix.configadmin/1.6.0
  org.apache.felix/org.apache.felix.webconsole/4.3.4
  commons-fileupload/commons-fileupload/1.3.2
