// Path: src/main/java/org/unbrokendome/gradle/plugins/gitversion/internal/DefaultVersioningRulesBuilder.java
// public class DefaultVersioningRulesBuilder implements VersioningRulesBuilder {
// 
//     private static final SemVersion DEFAULT_BASE_VERSION = SemVersion.create(0, 1, 0);
// 
//     private SemVersion baseVersion = DEFAULT_BASE_VERSION;
//     private List<Rule> beforeRules = new ArrayList<>(1);
//     private List<Rule> rules = new ArrayList<>(5);
//     private List<Rule> afterRules = new ArrayList<>(1);
// 
// 
//     @Nonnull
//     @Override
//     public VersioningRulesBuilder setBaseVersion(SemVersion baseVersion) {
//         this.baseVersion = SemVersion.immutableCopyOf(baseVersion);
//         return this;
//     }
// 
// 
//     @Nonnull
//     @Override
//     public VersioningRulesBuilder addBeforeRule(Rule rule) {
//         beforeRules.add(rule);
//         return this;
//     }
// 
// 
//     @Nonnull
//     @Override
//     public VersioningRulesBuilder addRule(Rule rule) {
//         rules.add(rule);
//         return this;
//     }
// 
// 
//     @Nonnull
//     @Override
//     public VersioningRulesBuilder addAfterRule(Rule rule) {
//         afterRules.add(rule);
//         return this;
//     }
// 
// 
//     @Nonnull
//     @Override
//     public VersioningRules build() {
//         Iterable<Rule> allRules = Iterables.concat(beforeRules, rules, afterRules);
//         return new DefaultVersioningRules(baseVersion, allRules);
//     }
// }
// 
// Path: src/main/java/org/unbrokendome/gradle/plugins/gitversion/model/GitRepository.java
// public interface GitRepository extends AutoCloseable {
// 
//     File getWorkingDir();
// 
//     @Nullable
//     GitCommit getHead();
// 
//     @Nullable
//     GitBranch getCurrentBranch();
// 
//     @Nullable
//     GitBranch getBranch(String name);
// 
//     @Nonnull
//     Collection<? extends GitBranch> getBranches();
// 
//     @Nonnull
//     Collection<? extends GitTag> getTags();
// 
//     @Nonnull
//     Set<String> getRemoteNames();
// 
//     @Nonnull
//     CloseableIterator<GitCommit> walk(GitCommit startCommit, WalkMode mode);
// 
//     default CloseableIterator<GitCommit> walk(GitCommit startCommit) {
//         return walk(startCommit, WalkMode.ALL);
//     }
// 
//     default CloseableIterator<GitCommit> walk(WalkMode walkMode) {
//         GitCommit head = getHead();
//         if (head == null) {
//             return CloseableIterator.emptyIterator();
//         }
//         return walk(getHead(), walkMode);
//     }
// 
//     default CloseableIterator<GitCommit> walk() {
//         return walk(WalkMode.ALL);
//     }
// 
//     default CloseableIterator<GitCommit> firstParentWalk(GitCommit startCommit) {
//         return walk(startCommit, WalkMode.FIRST_PARENT_ONLY);
//     }
// 
//     default CloseableIterator<GitCommit> firstParentWalk() {
//         return walk(WalkMode.FIRST_PARENT_ONLY);
//     }
// 
//     enum WalkMode {
//         ALL,
//         FIRST_PARENT_ONLY
//     }
// }
// 
// Path: src/main/java/org/unbrokendome/gradle/plugins/gitversion/version/SemVersion.java
// public interface SemVersion {
// 
//     int getMajor();
// 
//     int getMinor();
// 
//     int getPatch();
// 
//     @Nullable
//     String getPrereleaseTag();
// 
//     @Nullable
//     String getBuildMetadata();
// 
// 
//     @Nonnull
//     default MutableSemVersion cloneAsMutable() {
//         return new MutableSemVersionImpl()
//                 .setFrom(this);
//     }
// 
// 
//     @Nonnull
//     static SemVersion create(int major, int minor, int patch,
//                              @Nullable String prereleaseTag,
//                              @Nullable String buildMetadata) {
//         return new ImmutableSemVersionImpl(major, minor, patch, prereleaseTag, buildMetadata);
//     }
// 
// 
//     @Nonnull
//     static SemVersion create(int major, int minor, int patch, String prereleaseTag) {
//         return create(major, minor, patch, prereleaseTag, null);
//     }
// 
// 
//     @Nonnull
//     static SemVersion create(int major, int minor, int patch) {
//         return create(major, minor, patch, null, null);
//     }
// 
// 
//     @Nonnull
//     static SemVersion immutableCopyOf(SemVersion version) {
//         if (version instanceof ImmutableSemVersionImpl) {
//             return version;
// 
//         } else {
//             return create(version.getMajor(), version.getMinor(), version.getPatch(),
//                     version.getPrereleaseTag(), version.getBuildMetadata());
//         }
//     }
// 
// 
//     @Nonnull
//     static SemVersion parse(String input) {
//         return SemVersionParser.parse(input);
//     }
// }


import javax.annotation.Nonnull;
import org.gradle.api.Project;
import org.unbrokendome.gradle.plugins.gitversion.internal.DefaultVersioningRulesBuilder;
import org.unbrokendome.gradle.plugins.gitversion.model.GitRepository;
import org.unbrokendome.gradle.plugins.gitversion.version.SemVersion;
package org.unbrokendome.gradle.plugins.gitversion.core;




public interface VersioningRules {

    @Nonnull
// Path: src/main/java/org/unbrokendome/gradle/plugins/gitversion/internal/DefaultVersioningRulesBuilder.java
// public class DefaultVersioningRulesBuilder implements VersioningRulesBuilder {
// 
//     private static final SemVersion DEFAULT_BASE_VERSION = SemVersion.create(0, 1, 0);
// 
//     private SemVersion baseVersion = DEFAULT_BASE_VERSION;
//     private List<Rule> beforeRules = new ArrayList<>(1);
//     private List<Rule> rules = new ArrayList<>(5);
//     private List<Rule> afterRules = new ArrayList<>(1);
// 
// 
//     @Nonnull
//     @Override
//     public VersioningRulesBuilder setBaseVersion(SemVersion baseVersion) {
//         this.baseVersion = SemVersion.immutableCopyOf(baseVersion);
//         return this;
//     }
// 
// 
//     @Nonnull
//     @Override
//     public VersioningRulesBuilder addBeforeRule(Rule rule) {
//         beforeRules.add(rule);
//         return this;
//     }
// 
// 
//     @Nonnull
//     @Override
//     public VersioningRulesBuilder addRule(Rule rule) {
//         rules.add(rule);
//         return this;
//     }
// 
// 
//     @Nonnull
//     @Override
//     public VersioningRulesBuilder addAfterRule(Rule rule) {
//         afterRules.add(rule);
//         return this;
//     }
// 
// 
//     @Nonnull
//     @Override
//     public VersioningRules build() {
//         Iterable<Rule> allRules = Iterables.concat(beforeRules, rules, afterRules);
//         return new DefaultVersioningRules(baseVersion, allRules);
//     }
// }
// 
// Path: src/main/java/org/unbrokendome/gradle/plugins/gitversion/model/GitRepository.java
// public interface GitRepository extends AutoCloseable {
// 
//     File getWorkingDir();
// 
//     @Nullable
//     GitCommit getHead();
// 
//     @Nullable
//     GitBranch getCurrentBranch();
// 
//     @Nullable
//     GitBranch getBranch(String name);
// 
//     @Nonnull
//     Collection<? extends GitBranch> getBranches();
// 
//     @Nonnull
//     Collection<? extends GitTag> getTags();
// 
//     @Nonnull
//     Set<String> getRemoteNames();
// 
//     @Nonnull
//     CloseableIterator<GitCommit> walk(GitCommit startCommit, WalkMode mode);
// 
//     default CloseableIterator<GitCommit> walk(GitCommit startCommit) {
//         return walk(startCommit, WalkMode.ALL);
//     }
// 
//     default CloseableIterator<GitCommit> walk(WalkMode walkMode) {
//         GitCommit head = getHead();
//         if (head == null) {
//             return CloseableIterator.emptyIterator();
//         }
//         return walk(getHead(), walkMode);
//     }
// 
//     default CloseableIterator<GitCommit> walk() {
//         return walk(WalkMode.ALL);
//     }
// 
//     default CloseableIterator<GitCommit> firstParentWalk(GitCommit startCommit) {
//         return walk(startCommit, WalkMode.FIRST_PARENT_ONLY);
//     }
// 
//     default CloseableIterator<GitCommit> firstParentWalk() {
//         return walk(WalkMode.FIRST_PARENT_ONLY);
//     }
// 
//     enum WalkMode {
//         ALL,
//         FIRST_PARENT_ONLY
//     }
// }
// 
// Path: src/main/java/org/unbrokendome/gradle/plugins/gitversion/version/SemVersion.java
// public interface SemVersion {
// 
//     int getMajor();
// 
//     int getMinor();
// 
//     int getPatch();
// 
//     @Nullable
//     String getPrereleaseTag();
// 
//     @Nullable
//     String getBuildMetadata();
// 
// 
//     @Nonnull
//     default MutableSemVersion cloneAsMutable() {
//         return new MutableSemVersionImpl()
//                 .setFrom(this);
//     }
// 
// 
//     @Nonnull
//     static SemVersion create(int major, int minor, int patch,
//                              @Nullable String prereleaseTag,
//                              @Nullable String buildMetadata) {
//         return new ImmutableSemVersionImpl(major, minor, patch, prereleaseTag, buildMetadata);
//     }
// 
// 
//     @Nonnull
//     static SemVersion create(int major, int minor, int patch, String prereleaseTag) {
//         return create(major, minor, patch, prereleaseTag, null);
//     }
// 
// 
//     @Nonnull
//     static SemVersion create(int major, int minor, int patch) {
//         return create(major, minor, patch, null, null);
//     }
// 
// 
//     @Nonnull
//     static SemVersion immutableCopyOf(SemVersion version) {
//         if (version instanceof ImmutableSemVersionImpl) {
//             return version;
// 
//         } else {
//             return create(version.getMajor(), version.getMinor(), version.getPatch(),
//                     version.getPrereleaseTag(), version.getBuildMetadata());
//         }
//     }
// 
// 
//     @Nonnull
//     static SemVersion parse(String input) {
//         return SemVersionParser.parse(input);
//     }
// }


// Path: src/main/java/org/unbrokendome/gradle/plugins/gitversion/core/VersioningRules.java
import javax.annotation.Nonnull;
import org.gradle.api.Project;
import org.unbrokendome.gradle.plugins.gitversion.internal.DefaultVersioningRulesBuilder;
import org.unbrokendome.gradle.plugins.gitversion.model.GitRepository;
import org.unbrokendome.gradle.plugins.gitversion.version.SemVersion;

package org.unbrokendome.gradle.plugins.gitversion.core;




public interface VersioningRules {

    @Nonnull
    SemVersion evaluate(Project project, GitRepository gitRepository);