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