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.archive;
44
45 import java.io.IOException;
46 import java.io.OutputStream;
47 import java.text.MessageFormat;
48 import java.util.Arrays;
49 import java.util.Collections;
50 import java.util.List;
51 import java.util.Map;
52
53 import org.apache.commons.compress.archivers.ArchiveOutputStream;
54 import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
55 import org.apache.commons.compress.archivers.tar.TarArchiveOutputStream;
56 import org.apache.commons.compress.archivers.tar.TarConstants;
57 import org.eclipse.jgit.api.ArchiveCommand;
58 import org.eclipse.jgit.archive.internal.ArchiveText;
59 import org.eclipse.jgit.lib.FileMode;
60 import org.eclipse.jgit.lib.ObjectId;
61 import org.eclipse.jgit.lib.ObjectLoader;
62 import org.eclipse.jgit.revwalk.RevCommit;
63
64
65
66
67
68 public final class TarFormat extends BaseFormat implements
69 ArchiveCommand.Format<ArchiveOutputStream> {
70 private static final List<String> SUFFIXES = Collections
71 .unmodifiableList(Arrays.asList(".tar"));
72
73 @Override
74 public ArchiveOutputStream createArchiveOutputStream(OutputStream s)
75 throws IOException {
76 return createArchiveOutputStream(s,
77 Collections.<String, Object> emptyMap());
78 }
79
80
81
82
83 @Override
84 public ArchiveOutputStream createArchiveOutputStream(OutputStream s,
85 Map<String, Object> o) throws IOException {
86 TarArchiveOutputStream out = new TarArchiveOutputStream(s, "UTF-8");
87 out.setLongFileMode(TarArchiveOutputStream.LONGFILE_POSIX);
88 out.setBigNumberMode(TarArchiveOutputStream.BIGNUMBER_POSIX);
89 return applyFormatOptions(out, o);
90 }
91
92 @Deprecated
93 @Override
94 public void putEntry(ArchiveOutputStream out,
95 String path, FileMode mode, ObjectLoader loader)
96 throws IOException {
97 putEntry(out, null, path, mode,loader);
98 }
99
100
101
102
103 @Override
104 public void putEntry(ArchiveOutputStream out,
105 ObjectId tree, String path, FileMode mode, ObjectLoader loader)
106 throws IOException {
107 if (mode == FileMode.SYMLINK) {
108 final TarArchiveEntry entry = new TarArchiveEntry(
109 path, TarConstants.LF_SYMLINK);
110 entry.setLinkName(new String(
111 loader.getCachedBytes(100), "UTF-8"));
112 out.putArchiveEntry(entry);
113 out.closeArchiveEntry();
114 return;
115 }
116
117
118
119 if (path.endsWith("/") && mode != FileMode.TREE)
120 throw new IllegalArgumentException(MessageFormat.format(
121 ArchiveText.get().pathDoesNotMatchMode, path, mode));
122 if (!path.endsWith("/") && mode == FileMode.TREE)
123 path = path + "/";
124
125 final TarArchiveEntry entry = new TarArchiveEntry(path);
126
127 if (tree instanceof RevCommit) {
128 long t = ((RevCommit) tree).getCommitTime() * 1000L;
129 entry.setModTime(t);
130 }
131
132 if (mode == FileMode.TREE) {
133 out.putArchiveEntry(entry);
134 out.closeArchiveEntry();
135 return;
136 }
137
138 if (mode == FileMode.REGULAR_FILE) {
139
140 } else if (mode == FileMode.EXECUTABLE_FILE) {
141 entry.setMode(mode.getBits());
142 } else {
143
144 throw new IllegalArgumentException(MessageFormat.format(
145 ArchiveText.get().unsupportedMode, mode));
146 }
147 entry.setSize(loader.getSize());
148 out.putArchiveEntry(entry);
149 loader.copyTo(out);
150 out.closeArchiveEntry();
151 }
152
153 @Override
154 public Iterable<String> suffixes() {
155 return SUFFIXES;
156 }
157
158 @Override
159 public boolean equals(Object other) {
160 return (other instanceof TarFormat);
161 }
162
163 @Override
164 public int hashCode() {
165 return getClass().hashCode();
166 }
167 }