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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
|
/*
* Copyright (C) 2009, Constantine Plotnikov <constantine.plotnikov@gmail.com>
* Copyright (C) 2008, Google Inc.
* Copyright (C) 2008, Marek Zawirski <marek.zawirski@gmail.com>
* Copyright (C) 2008, Shawn O. Pearce <spearce@spearce.org> and others
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Distribution License v. 1.0 which is available at
* https://www.eclipse.org/org/documents/edl-v10.php.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
package org.eclipse.jgit.transport;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.Arrays;
import java.util.Collections;
import java.util.LinkedHashSet;
import java.util.Set;
import org.eclipse.jgit.errors.NotSupportedException;
import org.eclipse.jgit.errors.TransportException;
import org.eclipse.jgit.internal.JGitText;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.util.FS;
class TransportBundleFile extends Transport implements TransportBundle {
static final TransportProtocol PROTO_BUNDLE = new TransportProtocol() {
private final String[] schemeNames = { "bundle", "file" }; //$NON-NLS-1$ //$NON-NLS-2$
private final Set<String> schemeSet = Collections
.unmodifiableSet(new LinkedHashSet<>(Arrays
.asList(schemeNames)));
@Override
public String getName() {
return JGitText.get().transportProtoBundleFile;
}
@Override
public Set<String> getSchemes() {
return schemeSet;
}
@Override
public boolean canHandle(URIish uri, Repository local, String remoteName) {
if (uri.getPath() == null
|| uri.getPort() > 0
|| uri.getUser() != null
|| uri.getPass() != null
|| uri.getHost() != null
|| (uri.getScheme() != null && !getSchemes().contains(uri.getScheme())))
return false;
return true;
}
@Override
public Transport open(URIish uri, Repository local, String remoteName)
throws NotSupportedException, TransportException {
if ("bundle".equals(uri.getScheme())) { //$NON-NLS-1$
File path = FS.DETECTED.resolve(new File("."), uri.getPath()); //$NON-NLS-1$
return new TransportBundleFile(local, uri, path);
}
// This is an ambiguous reference, it could be a bundle file
// or it could be a Git repository. Allow TransportLocal to
// resolve the path and figure out which type it is by testing
// the target.
//
return TransportLocal.PROTO_LOCAL.open(uri, local, remoteName);
}
@Override
public Transport open(URIish uri) throws NotSupportedException,
TransportException {
if ("bundle".equals(uri.getScheme())) { //$NON-NLS-1$
File path = FS.DETECTED.resolve(new File("."), uri.getPath()); //$NON-NLS-1$
return new TransportBundleFile(uri, path);
}
return TransportLocal.PROTO_LOCAL.open(uri);
}
};
private final File bundle;
TransportBundleFile(Repository local, URIish uri, File bundlePath) {
super(local, uri);
bundle = bundlePath;
}
/**
* Constructor for TransportBundleFile.
*
* @param uri
* a {@link org.eclipse.jgit.transport.URIish} object.
* @param bundlePath
* transport bundle path
*/
public TransportBundleFile(URIish uri, File bundlePath) {
super(uri);
bundle = bundlePath;
}
@Override
public FetchConnection openFetch() throws NotSupportedException,
TransportException {
final InputStream src;
try {
src = new FileInputStream(bundle);
} catch (FileNotFoundException err) {
TransportException te = new TransportException(uri,
JGitText.get().notFound);
te.initCause(err);
throw te;
}
return new BundleFetchConnection(this, src);
}
@Override
public PushConnection openPush() throws NotSupportedException {
throw new NotSupportedException(
JGitText.get().pushIsNotSupportedForBundleTransport);
}
@Override
public void close() {
// Resources must be established per-connection.
}
}
|