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 package org.eclipse.jgit.ant.tasks;
44
45 import java.io.File;
46 import java.io.IOException;
47
48 import org.apache.tools.ant.BuildException;
49 import org.apache.tools.ant.Project;
50 import org.apache.tools.ant.Task;
51 import org.apache.tools.ant.types.DirSet;
52 import org.apache.tools.ant.types.FileSet;
53 import org.apache.tools.ant.types.resources.Union;
54 import org.eclipse.jgit.api.AddCommand;
55 import org.eclipse.jgit.api.Git;
56 import org.eclipse.jgit.api.errors.GitAPIException;
57 import org.eclipse.jgit.lib.Repository;
58 import org.eclipse.jgit.lib.RepositoryCache;
59 import org.eclipse.jgit.storage.file.FileRepositoryBuilder;
60 import org.eclipse.jgit.util.FS;
61
62
63
64
65
66
67
68 public class GitAddTask extends Task {
69
70 private File src;
71 private Union path;
72
73
74
75
76
77 public void setSrc(File src) {
78 this.src = src;
79 }
80
81
82
83
84
85
86
87 public void addFileset(FileSet set) {
88 getPath().add(set);
89 }
90
91
92
93
94
95
96
97 public void addDirset(DirSet set) {
98 getPath().add(set);
99 }
100
101 private synchronized Union getPath() {
102 if (path == null) {
103 path = new Union();
104 path.setProject(getProject());
105 }
106 return path;
107 }
108
109 @Override
110 public void execute() throws BuildException {
111 if (src == null) {
112 throw new BuildException("Repository path not specified.");
113 }
114 if (!RepositoryCache.FileKey.isGitRepository(new File(src, ".git"),
115 FS.DETECTED)) {
116 throw new BuildException("Specified path (" + src
117 + ") is not a git repository.");
118 }
119
120 AddCommand gitAdd;
121 try (Repository repo = new FileRepositoryBuilder().readEnvironment()
122 .findGitDir(src).build();
123 Git git = new Git(repo);) {
124 gitAdd = git.add();
125 } catch (IOException e) {
126 throw new BuildException("Could not access repository " + src, e);
127 }
128
129 try {
130 String prefix = src.getCanonicalPath();
131 String[] allFiles = getPath().list();
132
133 for (String file : allFiles) {
134 String toAdd = translateFilePathUsingPrefix(file, prefix);
135 log("Adding " + toAdd, Project.MSG_VERBOSE);
136 gitAdd.addFilepattern(toAdd);
137 }
138 gitAdd.call();
139 } catch (IOException | GitAPIException e) {
140 throw new BuildException("Could not add files to index." + src, e);
141 }
142
143 }
144
145 private String translateFilePathUsingPrefix(String file, String prefix)
146 throws IOException {
147 if (file.equals(prefix)) {
148 return ".";
149 }
150 return new File(file).getCanonicalPath().substring(prefix.length() + 1);
151 }
152
153 }