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.ObjectLoader;
61
62
63
64
65 public final class TarFormat extends BaseFormat implements
66 ArchiveCommand.Format<ArchiveOutputStream> {
67 private static final List<String> SUFFIXES = Collections
68 .unmodifiableList(Arrays.asList(".tar"));
69
70 public ArchiveOutputStream createArchiveOutputStream(OutputStream s)
71 throws IOException {
72 return createArchiveOutputStream(s,
73 Collections.<String, Object> emptyMap());
74 }
75
76
77
78
79 public ArchiveOutputStream createArchiveOutputStream(OutputStream s,
80 Map<String, Object> o) throws IOException {
81 TarArchiveOutputStream out = new TarArchiveOutputStream(s, "UTF-8");
82 out.setLongFileMode(TarArchiveOutputStream.LONGFILE_POSIX);
83 out.setBigNumberMode(TarArchiveOutputStream.BIGNUMBER_POSIX);
84 return applyFormatOptions(out, o);
85 }
86
87 public void putEntry(ArchiveOutputStream out,
88 String path, FileMode mode, ObjectLoader loader)
89 throws IOException {
90 if (mode == FileMode.SYMLINK) {
91 final TarArchiveEntry entry = new TarArchiveEntry(
92 path, TarConstants.LF_SYMLINK);
93 entry.setLinkName(new String(
94 loader.getCachedBytes(100), "UTF-8"));
95 out.putArchiveEntry(entry);
96 out.closeArchiveEntry();
97 return;
98 }
99
100
101
102 if (path.endsWith("/") && mode != FileMode.TREE)
103 throw new IllegalArgumentException(MessageFormat.format(
104 ArchiveText.get().pathDoesNotMatchMode, path, mode));
105 if (!path.endsWith("/") && mode == FileMode.TREE)
106 path = path + "/";
107
108 final TarArchiveEntry entry = new TarArchiveEntry(path);
109 if (mode == FileMode.TREE) {
110 out.putArchiveEntry(entry);
111 out.closeArchiveEntry();
112 return;
113 }
114
115 if (mode == FileMode.REGULAR_FILE) {
116
117 } else if (mode == FileMode.EXECUTABLE_FILE) {
118 entry.setMode(mode.getBits());
119 } else {
120
121 throw new IllegalArgumentException(MessageFormat.format(
122 ArchiveText.get().unsupportedMode, mode));
123 }
124 entry.setSize(loader.getSize());
125 out.putArchiveEntry(entry);
126 loader.copyTo(out);
127 out.closeArchiveEntry();
128 }
129
130 public Iterable<String> suffixes() {
131 return SUFFIXES;
132 }
133
134 @Override
135 public boolean equals(Object other) {
136 return (other instanceof TarFormat);
137 }
138
139 @Override
140 public int hashCode() {
141 return getClass().hashCode();
142 }
143 }