import { CommitData, PushProcessOptions, TypeOfCommit } from '../../index';
import { BaseFeatureForProject } from './base-feature-for-project';
import type { BaseProject } from './base-project';
export declare class BaseGit<PROJECT extends BaseProject = any> extends BaseFeatureForProject<PROJECT> {
    unstageAllFiles(): void;
    revertFileChanges(fileReletivePath: string): void;
    clone(url: string, destinationFolderName?: string, branchName?: string): Promise<string>;
    restoreLastVersion(relativeFilePath: string): void;
    stageAllFiles(): void;
    stageFile(relativeFilePath: string): void;
    stash(options?: {
        onlyStaged?: boolean;
    }): void;
    rebase(toBranch: string): void;
    stashApply(): void;
    fetch(all?: boolean): void;
    resetFiles(...relativePathes: string[]): void;
    get isInsideGitRepo(): boolean;
    get isWithoutGitRepository(): boolean;
    get isGitRoot(): boolean;
    get originURL(): string;
    commit(commitMessage?: string): void;
    /**
     * alias to stage all and commit
     */
    addAndCommit(commitMessage: string): void;
    /**
     * general default development branch for all kinds of projects
     */
    getDefaultDevelopmentBranch(): string;
    isUsingActionCommit(): boolean;
    jiraIssuesAreOutsideBrackets(): boolean;
    getUserInfo(global?: boolean): Promise<{
        name?: string;
        email?: string;
    }>;
    setUserInfo({ name, email }: {
        name?: string;
        email?: string;
    }, global?: boolean): Promise<void>;
    stageAllAndCommit(commitMessage: string): void;
    pushCurrentBranch(options?: {
        force?: boolean;
        origin?: string;
        askToRetry?: boolean;
        forcePushNoQuestion?: boolean;
    }): Promise<boolean>;
    get allOrigins(): {
        origin: string;
        url: string;
    }[];
    get uncommitedFiles(): string[];
    get thereAreSomeUncommitedChange(): boolean;
    thereAreSomeUncommitedChangeExcept(filesList?: string[]): boolean;
    /**
     * Resolve last changes
     * - uncommited changes
     * - action commits to melt
     */
    resolveLastChanges(options?: {
        tryAutomaticActionFirst?: boolean;
        projectNameAsOutputPrefix?: string;
        questionPrefixMessage?: string;
    }): Promise<void>;
    get hasActionCommitsToMelt(): boolean;
    /**
     * @returns number of melted commits
     */
    meltActionCommits(): number;
    /**
     *
     * @param newVersion
     * @param pushWithoutAsking
     */
    tagAndPushToGitRepo(newVersion: string, autoReleaseUsingConfig: boolean, isCiProcess: boolean): Promise<void>;
    pullCurrentBranch(options?: {
        askToRetry?: boolean;
        /**
         * default true, when false it will throw error instead process.exit(0)
         */
        exitOnError?: boolean;
        defaultHardResetCommits?: number;
    }): Promise<void>;
    get currentBranchName(): string;
    get listOfCurrentGitChanges(): {
        modified: string[];
        deleted: string[];
        created: string[];
    };
    getBranchesNamesBy(pattern: string | RegExp): string[];
    resetSoftHEAD(HEAD?: number): void;
    resetHard(options?: {
        HEAD?: number;
    }): void;
    countCommits(): number;
    hasAnyCommits(): boolean;
    get isInMergeProcess(): boolean;
    lastCommitDate(): Date | null;
    lastCommitHash(): string;
    lastCommitMessage(): string;
    penultimateCommitMessage(): Promise<string>;
    getCommitMessageByIndex(index: number): Promise<string>;
    getCommitMessageByHash(hash: string): Promise<string>;
    getCommitHashByIndex(index: number): Promise<string>;
    penultimateCommitHash(): string;
    checkTagExists(tag: string): boolean;
    checkout(branchName: string, options?: {
        createBranchIfNotExists?: boolean;
        fetchBeforeCheckout?: boolean;
        switchBranchWhenExists?: boolean;
    }): void;
    allowedGitEmailDomains(): string[];
    skipLintOnPush(): boolean;
    cleanRepoFromAnyFilesExceptDotGitFolder(): void;
    checkoutFromTo(checkoutFromBranch: string, branch: string, origin?: string): void;
    /**
     *
     * @param majorVersion example: v1, v2 etc.
     * @returns tag name
     */
    lastTagNameForMajorVersion(majorVersion: any): string;
    lastTagHash(): string;
    get remoteOriginUrl(): string;
    /**
     * get provider of remote origin
     */
    get remoteProvider(): string;
    get lastTagVersionName(): string;
    get stagedFiles(): string[];
    get stagedFilesRelativePaths(): string[];
    /**
     * TODO does this make any sense
     */
    renameOrigin(newNameOrUlr: string): void;
    /**
     * By default no translation of commit
     */
    transalteGitCommitFromArgs(): {
        from: string;
        to: string;
    };
    /**
     * By defult true.. when commit branches will not function.
     * (false is better for simple projects)
     */
    useGitBranchesWhenCommitingAndPushing(): boolean;
    /**
     * usefull when pushing in project with childrens as git repos
     */
    automaticallyAddAllChangesWhenPushingToGit(): boolean;
    /**
     * usefull when pushing in project with childrens as git repos
     */
    useGitBranchesAsMetadataForCommits(): boolean;
    /**
     * @returns true if clone was successful
     */
    cloneTo(cwd: string, newProjectName?: string): Promise<boolean>;
    /**
     * This is only for push/pull process
     *
     * There are 2 types of projects:
     * - with linked-projects.json
     * - with children from external folder
     *
     * projects that are children of this project (with its own git repo)
     */
    get gitChildren(): PROJECT[];
    protected setRemoteOriginType(setOrigin: 'ssh' | 'http'): Promise<void>;
    pullProcess(options?: {
        skipCloneGitChildren?: boolean;
        setOrigin?: 'ssh' | 'http';
    }): Promise<void>;
    validateEmailDomain(allowedEmailsEnds: string[]): Promise<void>;
    protected _afterPullProcessAction(setOrigin: 'ssh' | 'http', skipCloneGitChildren?: boolean): Promise<void>;
    backupBranch(branchName?: string): Promise<string>;
    pushProcess(options?: PushProcessOptions): Promise<void>;
    _beforeAnyActionOnGitRoot(): void;
    protected _beforePushProcessAction(setOrigin: 'ssh' | 'http'): Promise<void>;
    protected _beforePullProcessAction(setOrigin: 'ssh' | 'http', skipCloneGitChildren?: boolean): Promise<void>;
    protected _getCommitMessage(typeOfCommit: TypeOfCommit, args: string[], commitMessageRequired?: boolean, 
    /**
     * only needed when push github
     * and I forgot to add my username before issue
     * taon pfix proper input my-repo#344
     * that should be
     * taon pfix proper input my-username/my-repo#344
     */
    currentOrigin?: string): Promise<CommitData>;
    /**
     * This will prevent accidental branch change for taon projects
     * @returns branch name
     */
    duringPushWarnIfProjectNotOnSpecyficDevBranch(): string;
    getChangedFilesInCommitByHash(hash: string): Promise<string[]>;
    /**
     * @param index 0 - means last commit
     */
    getChangedFilesInCommitByIndex(index: number): Promise<string[]>;
    changesSummary(options?: {
        prefix?: string;
    }): Promise<string>;
    useBranchNameDirectlyAsCommitMessage(): boolean;
}
