Skip to content

Commit 1150ff0

Browse files
committed
removeTag
1 parent 06ad2e3 commit 1150ff0

File tree

1 file changed

+87
-37
lines changed

1 file changed

+87
-37
lines changed

src/main/java/org/scm4j/vcs/GitVCS.java

Lines changed: 87 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,19 @@
1515
import java.nio.charset.StandardCharsets;
1616
import java.util.ArrayList;
1717
import java.util.Collections;
18+
import java.util.Comparator;
19+
import java.util.Date;
1820
import java.util.HashSet;
1921
import java.util.List;
2022
import java.util.Set;
2123

2224
import org.apache.commons.io.FileUtils;
2325
import org.apache.commons.io.IOUtils;
26+
import org.eclipse.jgit.api.CheckoutCommand;
2427
import org.eclipse.jgit.api.CreateBranchCommand.SetupUpstreamMode;
2528
import org.eclipse.jgit.api.Git;
2629
import org.eclipse.jgit.api.ListBranchCommand.ListMode;
30+
import org.eclipse.jgit.api.LogCommand;
2731
import org.eclipse.jgit.api.MergeResult;
2832
import org.eclipse.jgit.api.PushCommand;
2933
import org.eclipse.jgit.api.ResetCommand.ResetType;
@@ -102,7 +106,7 @@ public Git getLocalGit(IVCSLockedWorkingCopy wc) throws Exception {
102106
.setURI(repo.getRepoUrl())
103107
.setCredentialsProvider(credentials)
104108
.setNoCheckout(true)
105-
.setBranch(Constants.R_HEADS + Constants.MASTER)
109+
//.setBranch(Constants.R_HEADS + Constants.MASTER)
106110
.call()
107111
.close();
108112
}
@@ -339,7 +343,7 @@ public VCSCommit setFileContent(String branchName, String filePath, String conte
339343
String bn = getRealBranchName(branchName);
340344
RefSpec refSpec = new RefSpec(bn + ":" + bn);
341345
push(git, refSpec);
342-
return new VCSCommit(newCommit.getName(), commitMessage, newCommit.getAuthorIdent().getName());
346+
return getVCSCommit(newCommit);
343347
} catch (GitAPIException e) {
344348
throw new EVCSException(e);
345349
} catch (Exception e) {
@@ -353,10 +357,15 @@ private void checkout(Git git, Repository gitRepo, String branchName) throws Exc
353357
.pull()
354358
.setCredentialsProvider(credentials)
355359
.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
360369
.setName(bn)
361370
.call();
362371
}
@@ -373,6 +382,8 @@ public List<VCSDiffEntry> getBranchesDiff(String srcBranchName, String dstBranch
373382
Repository gitRepo = git.getRepository();
374383
RevWalk walk = new RevWalk(gitRepo)) {
375384

385+
// https://stackoverflow.com/questions/34025577/jgit-how-to-show-changed-files-in-merge-commit
386+
376387
String srcBN = getRealBranchName(srcBranchName);
377388
String dstBN = getRealBranchName(dstBranchName);
378389

@@ -420,7 +431,9 @@ public List<VCSDiffEntry> getBranchesDiff(String srcBranchName, String dstBranch
420431
@Override
421432
public Set<String> getBranches() {
422433
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);
424437
List<Ref> refs = git
425438
.branchList()
426439
.setListMode(ListMode.REMOTE)
@@ -438,21 +451,26 @@ public Set<String> getBranches() {
438451
}
439452

440453
@Override
441-
public List<String> getCommitMessages(String branchName, Integer limit) {
454+
public List<VCSCommit> log(String branchName, int limit) {
442455
try (IVCSLockedWorkingCopy wc = repo.getVCSLockedWorkingCopy();
443456
Git git = getLocalGit(wc);
444457
Repository gitRepo = git.getRepository()) {
445458

446-
Iterable<RevCommit> logs = git
459+
LogCommand log = git
447460
.log()
448-
.add(gitRepo.resolve("refs/remotes/origin/" + getRealBranchName(branchName)))
449-
.setMaxCount(limit)
450-
.call();
461+
.add(gitRepo.resolve("refs/remotes/origin/" + getRealBranchName(branchName)));
451462

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<>();
453470
for (RevCommit commit : logs) {
454-
res.add(commit.getFullMessage());
471+
res.add(getVCSCommit(commit));
455472
}
473+
456474
return res;
457475
} catch (GitAPIException e) {
458476
throw new EVCSException(e);
@@ -487,14 +505,18 @@ public VCSCommit removeFile(String branchName, String filePath, String commitMes
487505
.call();
488506

489507
push(git, null);
490-
return new VCSCommit(res.getName(), res.getFullMessage(), res.getAuthorIdent().getName());
508+
return getVCSCommit(res);
491509
} catch (GitAPIException e) {
492510
throw new EVCSException(e);
493511
} catch (Exception e) {
494512
throw new RuntimeException(e);
495513
}
496514
}
497515

516+
private VCSCommit getVCSCommit(RevCommit revCommit) {
517+
return new VCSCommit(revCommit.getName(), revCommit.getFullMessage(), revCommit.getAuthorIdent().getName());
518+
}
519+
498520
public List<VCSCommit> getCommitsRange(String branchName, String afterCommitId, String untilCommitId) {
499521
try (IVCSLockedWorkingCopy wc = repo.getVCSLockedWorkingCopy();
500522
Git git = getLocalGit(wc);
@@ -520,8 +542,7 @@ public List<VCSCommit> getCommitsRange(String branchName, String afterCommitId,
520542

521543
List<VCSCommit> res = new ArrayList<>();
522544
for (RevCommit commit : commits) {
523-
VCSCommit vcsCommit = new VCSCommit(commit.getName(), commit.getFullMessage(),
524-
commit.getAuthorIdent().getName());
545+
VCSCommit vcsCommit = getVCSCommit(commit);
525546
res.add(vcsCommit);
526547
}
527548

@@ -585,8 +606,7 @@ public List<VCSCommit> getCommitsRange(String branchName, String startFromCommit
585606

586607
RevCommit commit = rw.next();
587608
while (commit != null) {
588-
VCSCommit vcsCommit = new VCSCommit(commit.getName(), commit.getFullMessage(),
589-
commit.getAuthorIdent().getName());
609+
VCSCommit vcsCommit = getVCSCommit(commit);
590610
res.add(vcsCommit);
591611
if (commit.getName().equals(endCommit.getName())) {
592612
break;
@@ -631,8 +651,7 @@ private RevCommit getHeadRevCommit (String branchName) {
631651
@Override
632652
public VCSCommit getHeadCommit(String branchName) {
633653
RevCommit branchHeadCommit = getHeadRevCommit(getRealBranchName(branchName));
634-
return new VCSCommit(branchHeadCommit.getName(), branchHeadCommit.getFullMessage(),
635-
branchHeadCommit.getAuthorIdent().getName());
654+
return getVCSCommit(branchHeadCommit);
636655
}
637656

638657
@Override
@@ -666,7 +685,7 @@ public VCSTag createTag(String branchName, String tagName, String tagMessage) th
666685

667686
RevTag revTag = rw.parseTag(ref.getObjectId());
668687
RevCommit revCommit = rw.parseCommit(ref.getObjectId());
669-
VCSCommit relatedCommit = new VCSCommit(revCommit.getName(), revCommit.getFullMessage(), revCommit.getAuthorIdent().getName());
688+
VCSCommit relatedCommit = getVCSCommit(revCommit);
670689
return new VCSTag(revTag.getTagName(), revTag.getFullMessage(), revTag.getTaggerIdent().getName(), relatedCommit);
671690
} catch(RefAlreadyExistsException e) {
672691
throw new EVCSTagExists(e);
@@ -700,9 +719,10 @@ public List<VCSTag> getTags() {
700719
RevTag revTag;
701720
RevCommit revCommit;
702721
for (Ref ref : tagRefs) {
722+
ObjectId relatedCommitObjectId = ref.getPeeledObjectId() == null ? ref.getObjectId() : ref.getPeeledObjectId();
703723
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);
706726
VCSTag tag = new VCSTag(revTag.getTagName(), revTag.getFullMessage(), revTag.getTaggerIdent().getName(), relatedCommit);
707727
res.add(tag);
708728
}
@@ -714,17 +734,13 @@ public List<VCSTag> getTags() {
714734
}
715735

716736
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());
728744
//return new ArrayList<>(Git
729745
//.lsRemoteRepository()
730746
//.setTags(true)
@@ -733,7 +749,6 @@ private List<Ref> getTagRefs() throws Exception {
733749
//.setCredentialsProvider(credentials)
734750
//.call());
735751
}
736-
}
737752

738753
@Override
739754
public VCSTag getLastTag() {
@@ -751,9 +766,21 @@ public VCSTag getLastTag() {
751766
Repository gitRepo = git.getRepository();
752767
RevWalk rw = new RevWalk(gitRepo)) {
753768

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+
754781
Ref ref = tagRefs.get(tagRefs.size() - 1);
755782
RevCommit revCommit = rw.parseCommit(ref.getObjectId());
756-
VCSCommit relatedCommit = new VCSCommit(revCommit.getName(), revCommit.getFullMessage(), revCommit.getAuthorIdent().getName());
783+
VCSCommit relatedCommit = getVCSCommit(revCommit);
757784
if (ref instanceof Unpeeled) {
758785
return new VCSTag(ref.getName().replace("refs/tags/", ""), null, null, relatedCommit);
759786
}
@@ -765,4 +792,27 @@ public VCSTag getLastTag() {
765792
throw new RuntimeException(e);
766793
}
767794
}
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+
}
768818
}

0 commit comments

Comments
 (0)