Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
*/

/*
* Copyright (c) 2008, 2023, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2008, 2024, Oracle and/or its affiliates. All rights reserved.
* Portions Copyright (c) 2017, 2020, Chris Fraire <[email protected]>.
* Portions Copyright (c) 2019, Krystof Tulinger <[email protected]>.
* Portions Copyright (c) 2023, Ric Harris <[email protected]>.
Expand All @@ -36,6 +36,7 @@
import java.util.List;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.Scanner;
import java.util.Set;
Expand Down Expand Up @@ -458,6 +459,11 @@ public int getPerPartesCount() {
return MAX_CHANGESETS;
}

private boolean isRepositoryEmpty() {
File headsFile = Paths.get(getDirectoryName(), Constants.DOT_GIT, "refs", "heads").toFile();
return headsFile.isDirectory() && (Objects.requireNonNull(headsFile.listFiles()).length == 0);
}

@Override
public void accept(String sinceRevision, Consumer<BoundaryChangesets.IdWithProgress> visitor, Progress progress)
throws HistoryException {
Expand All @@ -473,7 +479,11 @@ public void accept(String sinceRevision, Consumer<BoundaryChangesets.IdWithProgr
walk.markUninteresting(walk.lookupCommit(objId));
}
ObjectId objId = repository.resolve(Constants.HEAD);
if (objId == null) {
if (Objects.isNull(objId)) {
if (isRepositoryEmpty()) {
LOGGER.log(Level.FINEST, "ignoring empty repository {}", this);
return;
}
throw new HistoryException("cannot resolve HEAD");
}
walk.markStart(walk.parseCommit(objId));
Expand Down Expand Up @@ -512,6 +522,11 @@ public void traverseHistory(File file, String sinceRevision, String tillRevision
try (org.eclipse.jgit.lib.Repository repository = getJGitRepository(getDirectoryName());
RevWalk walk = new RevWalk(repository)) {

if (Objects.isNull(repository.resolve(Constants.HEAD)) && isRepositoryEmpty()) {
LOGGER.log(Level.FINEST, "ignoring empty repository {}", this);
return;
}

setupWalk(file, sinceRevision, tillRevision, repository, walk);

int num = 0;
Expand Down Expand Up @@ -544,17 +559,18 @@ public void traverseHistory(File file, String sinceRevision, String tillRevision
}

private void setupWalk(File file, String sinceRevision, String tillRevision, Repository repository, RevWalk walk)
throws IOException, ForbiddenSymlinkException {
throws IOException, ForbiddenSymlinkException, HistoryException {

if (sinceRevision != null) {
walk.markUninteresting(walk.lookupCommit(repository.resolve(sinceRevision)));
}

if (tillRevision != null) {
walk.markStart(walk.lookupCommit(repository.resolve(tillRevision)));
} else {
walk.markStart(walk.parseCommit(repository.resolve(Constants.HEAD)));
final String revStr = Objects.requireNonNullElse(tillRevision, Constants.HEAD);
ObjectId objectId = repository.resolve(revStr);
if (Objects.isNull(objectId)) {
throw new HistoryException("failed to lookup revision " + revStr);
}
walk.markStart(walk.lookupCommit(objectId));

String relativePath = RuntimeEnvironment.getInstance().getPathRelativeToSourceRoot(file);
if (!getDirectoryNameRelative().equals(relativePath)) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
*/

/*
* Copyright (c) 2014, 2023, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2014, 2024, Oracle and/or its affiliates. All rights reserved.
* Portions Copyright (c) 2018, 2020, Chris Fraire <[email protected]>.
* Portions Copyright (c) 2020, 2023, Ric Harris <[email protected]>.
*/
Expand Down Expand Up @@ -860,6 +860,25 @@ void testRenamedFileHistoryWithPerPartes(int maxCount) throws Exception {
assertEquals(8, updatedHistory.getHistoryEntries().size());
}

@Test
void testHistoryCacheForEmptyGitRepository() throws Exception {
File repositoryRoot = new File(repositories.getSourceRoot(), "emptyGit");
assertTrue(repositoryRoot.mkdir());
Git.init().setDirectory(repositoryRoot).call();

// Create untracked file.
Path untrackedFile = repositoryRoot.toPath().resolve("untrackedFile");
Files.createFile(untrackedFile);
assertTrue(untrackedFile.toFile().exists());

Repository repository = RepositoryFactory.getRepository(repositoryRoot);
assertNotNull(repository);
History history = repository.getHistory(repositoryRoot);
assertNotNull(history);
assertTrue(history.getHistoryEntries().isEmpty());
repository.createCache(cache, null);
}

/**
* Make sure produces correct history for a renamed and moved file in Subversion.
*/
Expand Down