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