blob: 72c90525a17b744ba861a4fd2468929e4f40b947 [file] [log] [blame]
/*
* 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.
*/
package org.netbeans.libs.git;
import org.eclipse.jgit.lib.RepositoryState;
import org.netbeans.libs.git.jgit.Utils;
/**
* Represents th state a repository is currently in. The state implies what git commands
* may be called on the repository and what should be the next steps to get the repository
* into a normal state.
* @author Ondra Vrabec
*/
public enum GitRepositoryState {
/** Has no work tree and cannot be used for normal editing. */
BARE {
@Override
public boolean canCheckout () { return false; }
@Override
public boolean canResetHead () { return false; }
@Override
public boolean canCommit () { return false; }
@Override
public String toString () { return Utils.getBundle(GitRepositoryState.class).getString("LBL_RepositoryInfo_Bare"); } //NOI18N
},
/**
* A safe state for working normally
* */
SAFE {
@Override
public boolean canCheckout () { return true; }
@Override
public boolean canResetHead () { return true; }
@Override
public boolean canCommit () { return true; }
@Override
public String toString () { return Utils.getBundle(GitRepositoryState.class).getString("LBL_RepositoryInfo_Safe"); } //NOI18N
},
/**
* An unfinished merge. Must resolve or reset before continuing normally
*/
MERGING {
@Override
public boolean canCheckout () { return false; }
@Override
public boolean canResetHead () { return true; }
@Override
public boolean canCommit () { return false; }
@Override
public String toString () { return Utils.getBundle(GitRepositoryState.class).getString("LBL_RepositoryInfo_Merging"); } //NOI18N
},
/**
* A merge where all conflicts have been resolved. The index does not
* contain any unmerged paths.
*/
MERGING_RESOLVED {
@Override
public boolean canCheckout () { return true; }
@Override
public boolean canResetHead () { return true; }
@Override
public boolean canCommit () { return true; }
@Override
public String toString () { return Utils.getBundle(GitRepositoryState.class).getString("LBL_RepositoryInfo_Merged"); } //NOI18N
},
/**
* An unfinished cherry-pick. Must resolve or reset before continuing normally
* @since 1.27
*/
CHERRY_PICKING {
@Override
public boolean canCheckout () { return false; }
@Override
public boolean canResetHead () { return true; }
@Override
public boolean canCommit () { return false; }
@Override
public String toString () { return Utils.getBundle(GitRepositoryState.class).getString("LBL_RepositoryInfo_CherryPicking"); } //NOI18N
},
/**
* A cherry-picked commit where all conflicts have been resolved. The index does not
* contain any unmerged paths and the repository requires a commit.
* @since 1.27
*/
CHERRY_PICKING_RESOLVED {
@Override
public boolean canCheckout () { return true; }
@Override
public boolean canResetHead () { return true; }
@Override
public boolean canCommit () { return true; }
@Override
public String toString () { return Utils.getBundle(GitRepositoryState.class).getString("LBL_RepositoryInfo_CherryPickingResolved"); } //NOI18N
},
/**
* An unfinished rebase or am. Must resolve, skip or abort before normal work can take place
*/
REBASING {
@Override
public boolean canCheckout () { return false; }
@Override
public boolean canResetHead () { return false; }
@Override
public boolean canCommit () { return true; }
@Override
public String toString () { return Utils.getBundle(GitRepositoryState.class).getString("LBL_RepositoryInfo_Rebasing"); } //NOI18N
},
/**
* An unfinished apply. Must resolve, skip or abort before normal work can take place
*/
APPLY {
@Override
public boolean canCheckout () { return false; }
@Override
public boolean canResetHead () { return false; }
@Override
public boolean canCommit () { return true; }
@Override
public String toString () { return Utils.getBundle(GitRepositoryState.class).getString("LBL_RepositoryInfo_Apply"); } //NOI18N
},
/**
* Bisecting being done. Normal work may continue but is discouraged
*/
BISECTING {
/* Changing head is a normal operation when bisecting */
@Override
public boolean canCheckout () { return true; }
/* Do not reset, checkout instead */
@Override
public boolean canResetHead () { return false; }
/* Commit during bisect is useful */
@Override
public boolean canCommit () { return true; }
@Override
public String toString () { return Utils.getBundle(GitRepositoryState.class).getString("LBL_RepositoryInfo_Bisecting"); } //NOI18N
};
/**
* @return true if changing HEAD is sane.
*/
public abstract boolean canCheckout ();
/**
* @return true if we can commit
*/
public abstract boolean canCommit ();
/**
* @return true if reset to another HEAD is considered SAFE
*/
public abstract boolean canResetHead ();
static GitRepositoryState getStateFor (RepositoryState state) {
switch (state) {
case APPLY:
return GitRepositoryState.APPLY;
case BARE:
return GitRepositoryState.BARE;
case BISECTING:
return GitRepositoryState.BISECTING;
case MERGING:
case REVERTING:
return GitRepositoryState.MERGING;
case CHERRY_PICKING:
return GitRepositoryState.CHERRY_PICKING;
case CHERRY_PICKING_RESOLVED:
return GitRepositoryState.CHERRY_PICKING_RESOLVED;
case MERGING_RESOLVED:
case REVERTING_RESOLVED:
return GitRepositoryState.MERGING_RESOLVED;
case REBASING:
case REBASING_INTERACTIVE:
case REBASING_MERGE:
case REBASING_REBASING:
return GitRepositoryState.REBASING;
case SAFE:
return GitRepositoryState.SAFE;
default:
throw new IllegalStateException(state.getDescription());
}
}
}