-
Notifications
You must be signed in to change notification settings - Fork 1.8k
/
AfterTagChangeSetFilter.java
50 lines (41 loc) · 2.01 KB
/
AfterTagChangeSetFilter.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
package liquibase.changelog.filter;
import liquibase.changelog.ChangeSet;
import liquibase.changelog.RanChangeSet;
import liquibase.exception.RollbackFailedException;
import liquibase.util.StringUtil;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class AfterTagChangeSetFilter implements ChangeSetFilter {
private final String tag;
private Set<String> changeLogsAfterTag = new HashSet<>();
public AfterTagChangeSetFilter(String tag, List<RanChangeSet> ranChangeSets) throws RollbackFailedException {
this.tag = tag;
boolean seenTag = false;
for (RanChangeSet ranChangeSet : ranChangeSets) {
if (seenTag && !tag.equalsIgnoreCase(ranChangeSet.getTag())) {
changeLogsAfterTag.add(changeLogToString(ranChangeSet.getId(), ranChangeSet.getAuthor(), ranChangeSet.getChangeLog()));
}
if (!seenTag && tag.equalsIgnoreCase(ranChangeSet.getTag())) {
seenTag = true;
if ("tagDatabase".equals(StringUtil.trimToEmpty(ranChangeSet.getDescription()))) { //changeSet is just tagging the database. Also remove it.
changeLogsAfterTag.add(changeLogToString(ranChangeSet.getId(), ranChangeSet.getAuthor(), ranChangeSet.getChangeLog()));
}
}
}
if (!seenTag) {
throw new RollbackFailedException("Could not find tag '"+tag+"' in the database");
}
}
private String changeLogToString(String id, String author, String changeLog) {
return id+":"+author+":"+changeLog;
}
@Override
public ChangeSetFilterResult accepts(ChangeSet changeSet) {
if (changeLogsAfterTag.contains(changeLogToString(changeSet.getId(), changeSet.getAuthor(), changeSet.getFilePath()))) {
return new ChangeSetFilterResult(true, "Changeset is before tag '"+tag+"'", this.getClass());
} else {
return new ChangeSetFilterResult(false, "Changeset after tag '"+tag+"'", this.getClass());
}
}
}