-
Notifications
You must be signed in to change notification settings - Fork 2
/
GitPushUploadStrategy.java
74 lines (64 loc) · 2.31 KB
/
GitPushUploadStrategy.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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
package com.github.stcarolas.enki.core.provider.strategies.upload;
import static com.github.stcarolas.enki.core.util.Lifting.call;
import static io.vavr.collection.List.empty;
import java.io.File;
import java.util.function.Supplier;
import com.github.stcarolas.enki.core.Repo;
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.transport.PushResult;
import io.vavr.Function1;
import io.vavr.control.Option;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.extern.log4j.Log4j2;
import static io.vavr.API.*;
@Log4j2
@AllArgsConstructor(access = AccessLevel.PRIVATE)
@Builder
@Getter
public class GitPushUploadStrategy<T extends Repo> implements Supplier<Iterable<PushResult>> {
private final Option<T> repository;
private final Function1<File, Option<Git>> gitOpenFn;
private final Function1<Git, Option<Iterable<PushResult>>> gitPushFn;
private final Function1<Repo, Option<File>> repoDirectoryFn;
// todo test for defaultGitOpenFn in GitPushUploadStrategy
public static final Function1<File, Option<Git>> defaultGitOpenFn = directory ->
Try(() -> Git.open(directory))
.onFailure(
error -> log.error( "error while acessing repository aborting push: {}", error)
)
.toOption()
;
public static final Function1<Git, Option<Iterable<PushResult>>> defaultGitPushFn = git ->
Try(() -> git.push().call())
.onFailure( error -> log.error("error while pushing repo: {}", error) )
.onSuccess( result -> log.info("git push result: {}", result) )
.toOption()
;
public static final Function1<Repo, Option<File>> defaultRepoDirectoryFn = repo ->
call(repo::directory)
.onEmpty( () -> log.error( "missing directory for repository {}, aborting push", repo) )
;
@Override
public Iterable<PushResult> get(){
return repository
.onEmpty(() -> log.error("missing repository for uploading, aborting push"))
.peek(repo -> log.info("pushing {}", repo))
.flatMap(repoDirectoryFn)
.flatMap(gitOpenFn)
.flatMap(gitPushFn)
.getOrElse(empty())
;
}
public static <T extends Repo> Supplier<Iterable<PushResult>> GitPushUploadStrategy(T repo){
return GitPushUploadStrategy.builder()
.repository(Option(repo))
.repoDirectoryFn(defaultRepoDirectoryFn)
.gitOpenFn(defaultGitOpenFn)
.gitPushFn(defaultGitPushFn)
.build()
;
}
}