1818 */
1919
2020/*
21- * Copyright (c) 2008, 2023 , Oracle and/or its affiliates. All rights reserved.
21+ * Copyright (c) 2008, 2024 , Oracle and/or its affiliates. All rights reserved.
2222 * Portions Copyright (c) 2017, 2020, Chris Fraire <cfraire@me.com>.
2323 * Portions Copyright (c) 2019, Krystof Tulinger <k.tulinger@seznam.cz>.
2424 * Portions Copyright (c) 2023, Ric Harris <harrisric@users.noreply.github.com>.
3636import java .util .List ;
3737import java .util .HashMap ;
3838import java .util .Map ;
39+ import java .util .Objects ;
3940import java .util .Optional ;
4041import java .util .Scanner ;
4142import java .util .Set ;
@@ -458,6 +459,11 @@ public int getPerPartesCount() {
458459 return MAX_CHANGESETS ;
459460 }
460461
462+ private boolean isRepositoryEmpty () {
463+ File headsFile = Paths .get (getDirectoryName (), Constants .DOT_GIT , "refs" , "heads" ).toFile ();
464+ return headsFile .isDirectory () && (Objects .requireNonNull (headsFile .listFiles ()).length == 0 );
465+ }
466+
461467 @ Override
462468 public void accept (String sinceRevision , Consumer <BoundaryChangesets .IdWithProgress > visitor , Progress progress )
463469 throws HistoryException {
@@ -473,7 +479,11 @@ public void accept(String sinceRevision, Consumer<BoundaryChangesets.IdWithProgr
473479 walk .markUninteresting (walk .lookupCommit (objId ));
474480 }
475481 ObjectId objId = repository .resolve (Constants .HEAD );
476- if (objId == null ) {
482+ if (Objects .isNull (objId )) {
483+ if (isRepositoryEmpty ()) {
484+ LOGGER .log (Level .FINEST , "ignoring empty repository {}" , this );
485+ return ;
486+ }
477487 throw new HistoryException ("cannot resolve HEAD" );
478488 }
479489 walk .markStart (walk .parseCommit (objId ));
@@ -512,6 +522,11 @@ public void traverseHistory(File file, String sinceRevision, String tillRevision
512522 try (org .eclipse .jgit .lib .Repository repository = getJGitRepository (getDirectoryName ());
513523 RevWalk walk = new RevWalk (repository )) {
514524
525+ if (Objects .isNull (repository .resolve (Constants .HEAD )) && isRepositoryEmpty ()) {
526+ LOGGER .log (Level .FINEST , "ignoring empty repository {}" , this );
527+ return ;
528+ }
529+
515530 setupWalk (file , sinceRevision , tillRevision , repository , walk );
516531
517532 int num = 0 ;
@@ -544,17 +559,18 @@ public void traverseHistory(File file, String sinceRevision, String tillRevision
544559 }
545560
546561 private void setupWalk (File file , String sinceRevision , String tillRevision , Repository repository , RevWalk walk )
547- throws IOException , ForbiddenSymlinkException {
562+ throws IOException , ForbiddenSymlinkException , HistoryException {
548563
549564 if (sinceRevision != null ) {
550565 walk .markUninteresting (walk .lookupCommit (repository .resolve (sinceRevision )));
551566 }
552567
553- if ( tillRevision != null ) {
554- walk . markStart ( walk . lookupCommit ( repository .resolve (tillRevision )) );
555- } else {
556- walk . markStart ( walk . parseCommit ( repository . resolve ( Constants . HEAD )) );
568+ final String revStr = Objects . requireNonNullElse ( tillRevision , Constants . HEAD );
569+ ObjectId objectId = repository .resolve (revStr );
570+ if ( Objects . isNull ( objectId )) {
571+ throw new HistoryException ( "failed to lookup revision " + revStr );
557572 }
573+ walk .markStart (walk .lookupCommit (objectId ));
558574
559575 String relativePath = RuntimeEnvironment .getInstance ().getPathRelativeToSourceRoot (file );
560576 if (!getDirectoryNameRelative ().equals (relativePath )) {
0 commit comments