<!--

 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.

-->
<Project>
  <Import Project="build\Dependencies.props" />

  <PropertyGroup>
    <LangVersion>9.0</LangVersion>
  </PropertyGroup>
  
  <!-- IMPORTANT: When these values are changed, the CI counter number should also be reset. -->
  <PropertyGroup Label="Version of Builds">
    <!-- IMPORTANT: VersionPrefix must always be the same as the Lucene version this is based on.
      Never increment it for an individual build - only increment this when an entire version's changes
      are ported over from Lucene. This is what determines the version of all of the NuGet packages and binaries. 
      For patching a production build, we will add a 4th segment (4.8.0.1) since it would be confusing to increment to 
      4.8.1 if we haven't actually ported over the changes from Lucene 4.8.1. -->
    <VersionPrefix>4.8.0</VersionPrefix>

    <!-- .NET enforces AssemblyVersion as the "major" version (when strong-named),
      so AssemblyVersion should only be changed for each major version release. -->
    <AssemblyVersion>4.0.0</AssemblyVersion>
  </PropertyGroup>

  <PropertyGroup Label="Assembly Signing">
    <AssemblyOriginatorKeyFile>$(MSBuildThisFileDirectory)Lucene.Net.snk</AssemblyOriginatorKeyFile>
    <PublicKey>002400000480000094000000060200000024000052534131000400000100010075a07ce602f88ef263c7db8cb342c58ebd49ecdcc210fac874260b0213fb929ac3dcaf4f5b39744b800f99073eca72aebfac5f7284e1d5f2c82012a804a140f06d7d043d83e830cdb606a04da2ad5374cc92c0a49508437802fb4f8fb80a05e59f80afb99f4ccd0dfe44065743543c4b053b669509d29d332cd32a0cb1e97e84</PublicKey>
    <SignAssembly>true</SignAssembly>
  </PropertyGroup>

  <PropertyGroup Label="NuGet Package Defaults">
    <IsPackable>false</IsPackable>
    <IncludeSymbols>true</IncludeSymbols>
    <!-- This is the new symbols format (the only one currently supported at NuGet.org) -->
    <SymbolPackageFormat>snupkg</SymbolPackageFormat>
  </PropertyGroup>
  
  <PropertyGroup Label="Copyright Info">
    <Product>Lucene.Net</Product>
    <Company>The Apache Software Foundation</Company>
    <CurrentYear Condition=" '$(CurrentYear)' == '' ">$([System.DateTime]::UtcNow.Year.ToString())</CurrentYear>
    <BeginCopyrightYear>2006</BeginCopyrightYear>
    <CopyrightYearRange>$(BeginCopyrightYear) - $(CurrentYear)</CopyrightYearRange>
    <CopyrightYearRange Condition=" '$(BeginCopyrightYear)' == '$(CurrentYear)' ">$(CurrentYear)</CopyrightYearRange>
    <Copyright>Copyright © $(CopyrightYearRange) $(Company)</Copyright>
  </PropertyGroup>

  <!-- Settings to override the above Version of Builds. These can be used to 
      "freeze" the build number for a release, so whether building within 
      an IDE or from the commmand line, the version is always what is 
      in Version.props, if it exists and the PrepareForBuild argument 
      passed into build.ps1 is 'false'. -->
  <Import Project="Version.props" Condition="Exists('Version.props')" />
</Project>