15
15
import java .nio .charset .StandardCharsets ;
16
16
import java .util .ArrayList ;
17
17
import java .util .Collections ;
18
+ import java .util .Comparator ;
19
+ import java .util .Date ;
18
20
import java .util .HashSet ;
19
21
import java .util .List ;
20
22
import java .util .Set ;
21
23
22
24
import org .apache .commons .io .FileUtils ;
23
25
import org .apache .commons .io .IOUtils ;
26
+ import org .eclipse .jgit .api .CheckoutCommand ;
24
27
import org .eclipse .jgit .api .CreateBranchCommand .SetupUpstreamMode ;
25
28
import org .eclipse .jgit .api .Git ;
26
29
import org .eclipse .jgit .api .ListBranchCommand .ListMode ;
30
+ import org .eclipse .jgit .api .LogCommand ;
27
31
import org .eclipse .jgit .api .MergeResult ;
28
32
import org .eclipse .jgit .api .PushCommand ;
29
33
import org .eclipse .jgit .api .ResetCommand .ResetType ;
@@ -102,7 +106,7 @@ public Git getLocalGit(IVCSLockedWorkingCopy wc) throws Exception {
102
106
.setURI (repo .getRepoUrl ())
103
107
.setCredentialsProvider (credentials )
104
108
.setNoCheckout (true )
105
- .setBranch (Constants .R_HEADS + Constants .MASTER )
109
+ // .setBranch(Constants.R_HEADS + Constants.MASTER)
106
110
.call ()
107
111
.close ();
108
112
}
@@ -339,7 +343,7 @@ public VCSCommit setFileContent(String branchName, String filePath, String conte
339
343
String bn = getRealBranchName (branchName );
340
344
RefSpec refSpec = new RefSpec (bn + ":" + bn );
341
345
push (git , refSpec );
342
- return new VCSCommit (newCommit . getName (), commitMessage , newCommit . getAuthorIdent (). getName () );
346
+ return getVCSCommit (newCommit );
343
347
} catch (GitAPIException e ) {
344
348
throw new EVCSException (e );
345
349
} catch (Exception e ) {
@@ -353,10 +357,15 @@ private void checkout(Git git, Repository gitRepo, String branchName) throws Exc
353
357
.pull ()
354
358
.setCredentialsProvider (credentials )
355
359
.call ();
356
- git
357
- .checkout ()
358
- .setCreateBranch (gitRepo .exactRef ("refs/heads/" + bn ) == null )
359
- .setStartPoint (bn )
360
+ CheckoutCommand cmd = git
361
+ .checkout ();
362
+ Ref ref = gitRepo .exactRef ("refs/heads/" + bn );
363
+ if (ref == null ) {
364
+ cmd = cmd
365
+ .setCreateBranch (true )
366
+ .setStartPoint ("origin/" + bn );
367
+ }
368
+ cmd
360
369
.setName (bn )
361
370
.call ();
362
371
}
@@ -373,6 +382,8 @@ public List<VCSDiffEntry> getBranchesDiff(String srcBranchName, String dstBranch
373
382
Repository gitRepo = git .getRepository ();
374
383
RevWalk walk = new RevWalk (gitRepo )) {
375
384
385
+ // https://stackoverflow.com/questions/34025577/jgit-how-to-show-changed-files-in-merge-commit
386
+
376
387
String srcBN = getRealBranchName (srcBranchName );
377
388
String dstBN = getRealBranchName (dstBranchName );
378
389
@@ -420,7 +431,9 @@ public List<VCSDiffEntry> getBranchesDiff(String srcBranchName, String dstBranch
420
431
@ Override
421
432
public Set <String > getBranches () {
422
433
try (IVCSLockedWorkingCopy wc = repo .getVCSLockedWorkingCopy ();
423
- Git git = getLocalGit (wc )) {
434
+ Git git = getLocalGit (wc );
435
+ Repository gitRepo = git .getRepository ()) {
436
+ checkout (git , gitRepo , MASTER_BRANCH_NAME );
424
437
List <Ref > refs = git
425
438
.branchList ()
426
439
.setListMode (ListMode .REMOTE )
@@ -438,21 +451,26 @@ public Set<String> getBranches() {
438
451
}
439
452
440
453
@ Override
441
- public List <String > getCommitMessages (String branchName , Integer limit ) {
454
+ public List <VCSCommit > log (String branchName , int limit ) {
442
455
try (IVCSLockedWorkingCopy wc = repo .getVCSLockedWorkingCopy ();
443
456
Git git = getLocalGit (wc );
444
457
Repository gitRepo = git .getRepository ()) {
445
458
446
- Iterable < RevCommit > logs = git
459
+ LogCommand log = git
447
460
.log ()
448
- .add (gitRepo .resolve ("refs/remotes/origin/" + getRealBranchName (branchName )))
449
- .setMaxCount (limit )
450
- .call ();
461
+ .add (gitRepo .resolve ("refs/remotes/origin/" + getRealBranchName (branchName )));
451
462
452
- List <String > res = new ArrayList <>();
463
+ if (limit > 0 ) {
464
+ log .setMaxCount (limit );
465
+ }
466
+
467
+ Iterable <RevCommit > logs = log .call ();
468
+
469
+ List <VCSCommit > res = new ArrayList <>();
453
470
for (RevCommit commit : logs ) {
454
- res .add (commit . getFullMessage ( ));
471
+ res .add (getVCSCommit ( commit ));
455
472
}
473
+
456
474
return res ;
457
475
} catch (GitAPIException e ) {
458
476
throw new EVCSException (e );
@@ -487,14 +505,18 @@ public VCSCommit removeFile(String branchName, String filePath, String commitMes
487
505
.call ();
488
506
489
507
push (git , null );
490
- return new VCSCommit (res . getName (), res . getFullMessage (), res . getAuthorIdent (). getName () );
508
+ return getVCSCommit (res );
491
509
} catch (GitAPIException e ) {
492
510
throw new EVCSException (e );
493
511
} catch (Exception e ) {
494
512
throw new RuntimeException (e );
495
513
}
496
514
}
497
515
516
+ private VCSCommit getVCSCommit (RevCommit revCommit ) {
517
+ return new VCSCommit (revCommit .getName (), revCommit .getFullMessage (), revCommit .getAuthorIdent ().getName ());
518
+ }
519
+
498
520
public List <VCSCommit > getCommitsRange (String branchName , String afterCommitId , String untilCommitId ) {
499
521
try (IVCSLockedWorkingCopy wc = repo .getVCSLockedWorkingCopy ();
500
522
Git git = getLocalGit (wc );
@@ -520,8 +542,7 @@ public List<VCSCommit> getCommitsRange(String branchName, String afterCommitId,
520
542
521
543
List <VCSCommit > res = new ArrayList <>();
522
544
for (RevCommit commit : commits ) {
523
- VCSCommit vcsCommit = new VCSCommit (commit .getName (), commit .getFullMessage (),
524
- commit .getAuthorIdent ().getName ());
545
+ VCSCommit vcsCommit = getVCSCommit (commit );
525
546
res .add (vcsCommit );
526
547
}
527
548
@@ -585,8 +606,7 @@ public List<VCSCommit> getCommitsRange(String branchName, String startFromCommit
585
606
586
607
RevCommit commit = rw .next ();
587
608
while (commit != null ) {
588
- VCSCommit vcsCommit = new VCSCommit (commit .getName (), commit .getFullMessage (),
589
- commit .getAuthorIdent ().getName ());
609
+ VCSCommit vcsCommit = getVCSCommit (commit );
590
610
res .add (vcsCommit );
591
611
if (commit .getName ().equals (endCommit .getName ())) {
592
612
break ;
@@ -631,8 +651,7 @@ private RevCommit getHeadRevCommit (String branchName) {
631
651
@ Override
632
652
public VCSCommit getHeadCommit (String branchName ) {
633
653
RevCommit branchHeadCommit = getHeadRevCommit (getRealBranchName (branchName ));
634
- return new VCSCommit (branchHeadCommit .getName (), branchHeadCommit .getFullMessage (),
635
- branchHeadCommit .getAuthorIdent ().getName ());
654
+ return getVCSCommit (branchHeadCommit );
636
655
}
637
656
638
657
@ Override
@@ -666,7 +685,7 @@ public VCSTag createTag(String branchName, String tagName, String tagMessage) th
666
685
667
686
RevTag revTag = rw .parseTag (ref .getObjectId ());
668
687
RevCommit revCommit = rw .parseCommit (ref .getObjectId ());
669
- VCSCommit relatedCommit = new VCSCommit (revCommit . getName (), revCommit . getFullMessage (), revCommit . getAuthorIdent (). getName () );
688
+ VCSCommit relatedCommit = getVCSCommit (revCommit );
670
689
return new VCSTag (revTag .getTagName (), revTag .getFullMessage (), revTag .getTaggerIdent ().getName (), relatedCommit );
671
690
} catch (RefAlreadyExistsException e ) {
672
691
throw new EVCSTagExists (e );
@@ -700,9 +719,10 @@ public List<VCSTag> getTags() {
700
719
RevTag revTag ;
701
720
RevCommit revCommit ;
702
721
for (Ref ref : tagRefs ) {
722
+ ObjectId relatedCommitObjectId = ref .getPeeledObjectId () == null ? ref .getObjectId () : ref .getPeeledObjectId ();
703
723
revTag = rw .parseTag (ref .getObjectId ());
704
- revCommit = rw .parseCommit (ref . getObjectId () );
705
- VCSCommit relatedCommit = new VCSCommit (revCommit . getName (), revCommit . getFullMessage (), revCommit . getAuthorIdent (). getName () );
724
+ revCommit = rw .parseCommit (relatedCommitObjectId );
725
+ VCSCommit relatedCommit = getVCSCommit (revCommit );
706
726
VCSTag tag = new VCSTag (revTag .getTagName (), revTag .getFullMessage (), revTag .getTaggerIdent ().getName (), relatedCommit );
707
727
res .add (tag );
708
728
}
@@ -714,17 +734,13 @@ public List<VCSTag> getTags() {
714
734
}
715
735
716
736
private List <Ref > getTagRefs () throws Exception {
717
- try (IVCSLockedWorkingCopy wc = repo .getVCSLockedWorkingCopy ();
718
- Git git = getLocalGit (wc );
719
- Repository gitRepo = git .getRepository ()) {
720
-
721
- checkout (git , gitRepo , MASTER_BRANCH_NAME );
722
-
723
- List <Ref > refs = git
724
- .tagList ()
725
- .call ();
726
-
727
- return refs ;
737
+ return new ArrayList <>(Git
738
+ .lsRemoteRepository ()
739
+ .setTags (true )
740
+ .setHeads (false )
741
+ .setRemote (repo .getRepoUrl ())
742
+ .setCredentialsProvider (credentials )
743
+ .call ());
728
744
//return new ArrayList<>(Git
729
745
//.lsRemoteRepository()
730
746
//.setTags(true)
@@ -733,7 +749,6 @@ private List<Ref> getTagRefs() throws Exception {
733
749
//.setCredentialsProvider(credentials)
734
750
//.call());
735
751
}
736
- }
737
752
738
753
@ Override
739
754
public VCSTag getLastTag () {
@@ -751,9 +766,21 @@ public VCSTag getLastTag() {
751
766
Repository gitRepo = git .getRepository ();
752
767
RevWalk rw = new RevWalk (gitRepo )) {
753
768
769
+ Collections .sort (tagRefs , new Comparator <Ref >() {
770
+ public int compare (Ref o1 , Ref o2 ) {
771
+ try {
772
+ Date d1 = rw .parseTag (o1 .getObjectId ()).getTaggerIdent ().getWhen ();
773
+ Date d2 = rw .parseTag (o2 .getObjectId ()).getTaggerIdent ().getWhen ();
774
+ return d1 .compareTo (d2 );
775
+ } catch (IOException e ) {
776
+ throw new RuntimeException (e );
777
+ }
778
+ }
779
+ });
780
+
754
781
Ref ref = tagRefs .get (tagRefs .size () - 1 );
755
782
RevCommit revCommit = rw .parseCommit (ref .getObjectId ());
756
- VCSCommit relatedCommit = new VCSCommit (revCommit . getName (), revCommit . getFullMessage (), revCommit . getAuthorIdent (). getName () );
783
+ VCSCommit relatedCommit = getVCSCommit (revCommit );
757
784
if (ref instanceof Unpeeled ) {
758
785
return new VCSTag (ref .getName ().replace ("refs/tags/" , "" ), null , null , relatedCommit );
759
786
}
@@ -765,4 +792,27 @@ public VCSTag getLastTag() {
765
792
throw new RuntimeException (e );
766
793
}
767
794
}
795
+
796
+ @ Override
797
+ public void removeTag (String tagName ) {
798
+ try (IVCSLockedWorkingCopy wc = repo .getVCSLockedWorkingCopy ();
799
+ Git git = getLocalGit (wc );
800
+ Repository gitRepo = git .getRepository ();
801
+ RevWalk rw = new RevWalk (gitRepo )) {
802
+
803
+ checkout (git , gitRepo , MASTER_BRANCH_NAME );
804
+
805
+ git
806
+ .tagDelete ()
807
+ .setTags (tagName )
808
+ .call ();
809
+
810
+ push (git , null );
811
+
812
+ } catch (GitAPIException e ) {
813
+ throw new EVCSException (e );
814
+ } catch (Exception e ) {
815
+ throw new RuntimeException (e );
816
+ }
817
+ }
768
818
}
0 commit comments