blob: a71df5c39307eaf1f6d6e7fa1e693854c792e348 [file] [log] [blame]
/*
* Copyright 2000-2013 JetBrains s.r.o.
*
* Licensed 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 com.intellij.dvcs.repo;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vcs.AbstractVcs;
import com.intellij.openapi.vfs.VirtualFile;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
* <p>
* Repository is a representation of a Git repository stored under the specified directory.
* It stores the information about the repository, which is frequently requested by other plugin components.
* All get-methods (like {@link #getCurrentRevision()}) are just getters of the correspondent fields and thus are very fast.
* </p>
* <p>
* The Repository is updated "externally" by the appropriate Updater class}, when correspondent {@code .git/ or .hg/} service files
* change.
* </p>
* <p>
* To force asynchronous update, it is enough to call {@link VirtualFile#refresh(boolean, boolean) refresh} on the root directory.
* </p>
* <p>
* To make a synchronous update of the repository call {@link #update()}.
* Updating requires reading from disk, so it may take some time, however, updating the whole community repository took ~10 ms at the time
* of measurement, so must be fast enough. Better not to be called in AWT though.
* <p/>
* <p>
* Getters and setters (update...()-methods) are not synchronized intentionally - to avoid live- and deadlocks.
* GitRepository is updated asynchronously,
* so even if the getters would have been synchronized, it wouldn't guarantee that they return actual values (as they are in .git).
* <br/>
* If one needs a really 100 % up-to-date value, one should call {@link #update()} and then get...().
* update() is a synchronous read from repository file (.git or .hg), so it is guaranteed to query the real value.
* </p>
*/
public interface Repository extends Disposable {
/**
* Current state of the repository.
*/
enum State {
/**
* HEAD is on branch, no merge process is in progress (and no rebase as well).
*/
NORMAL,
/**
* During merge (for instance, merge failed with conflicts that weren't immediately resolved).
*/
MERGING {
@NotNull
@Override
public String toString() {
return "Merging";
}
},
/**
* During rebase.
*/
REBASING {
@NotNull
@Override
public String toString() {
return "Rebasing";
}
},
/**
* Detached HEAD state, but not during rebase (for example, manual checkout of a commit hash).
*/
DETACHED
}
@NotNull
VirtualFile getRoot();
@NotNull
String getPresentableUrl();
@NotNull
Project getProject();
@NotNull
State getState();
@Nullable
String getCurrentBranchName();
@Nullable
AbstractVcs getVcs();
/**
* Returns the hash of the revision, which HEAD currently points to.
* Returns null only in the case of a fresh repository, when no commit have been made.
*/
@Nullable
String getCurrentRevision();
/**
* @return true if current repository is "fresh", i.e. if no commits have been made yet.
*/
boolean isFresh();
/**
* Synchronously updates the Repository by reading information about it from disk (e.g. for Git: from .git/config and .git/refs/...)
*/
void update();
/**
* Returns a detailed String representation suitable for logging purposes.
*/
@NotNull
String toLogString();
}