Merge changes from topic 'packed-batch-ref-update'
* changes: RefList: Support capacity <= 0 on new builders Short-circuit writing packed-refs if no refs were packed BatchRefUpdate: Clarify some ref prefix calls
This commit is contained in:
commit
106ed5fea0
|
@ -647,16 +647,32 @@ public void pack(List<String> refs) throws IOException {
|
||||||
RefList<Ref> cur = readPackedRefs();
|
RefList<Ref> cur = readPackedRefs();
|
||||||
|
|
||||||
// Iterate over all refs to be packed
|
// Iterate over all refs to be packed
|
||||||
|
boolean dirty = false;
|
||||||
for (String refName : refs) {
|
for (String refName : refs) {
|
||||||
Ref ref = readRef(refName, cur);
|
Ref oldRef = readRef(refName, cur);
|
||||||
if (ref.isSymbolic())
|
if (oldRef.isSymbolic()) {
|
||||||
continue; // can't pack symbolic refs
|
continue; // can't pack symbolic refs
|
||||||
|
}
|
||||||
// Add/Update it to packed-refs
|
// Add/Update it to packed-refs
|
||||||
|
Ref newRef = peeledPackedRef(oldRef);
|
||||||
|
if (newRef == oldRef) {
|
||||||
|
// No-op; peeledPackedRef returns the input ref only if it's already
|
||||||
|
// packed, and readRef returns a packed ref only if there is no loose
|
||||||
|
// ref.
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
dirty = true;
|
||||||
int idx = cur.find(refName);
|
int idx = cur.find(refName);
|
||||||
if (idx >= 0)
|
if (idx >= 0) {
|
||||||
cur = cur.set(idx, peeledPackedRef(ref));
|
cur = cur.set(idx, newRef);
|
||||||
else
|
} else {
|
||||||
cur = cur.add(idx, peeledPackedRef(ref));
|
cur = cur.add(idx, newRef);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!dirty) {
|
||||||
|
// All requested refs were already packed accurately
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// The new content for packed-refs is collected. Persist it.
|
// The new content for packed-refs is collected. Persist it.
|
||||||
|
|
|
@ -462,7 +462,7 @@ public void execute(RevWalk walk, ProgressMonitor monitor,
|
||||||
break SWITCH;
|
break SWITCH;
|
||||||
}
|
}
|
||||||
ru.setCheckConflicting(false);
|
ru.setCheckConflicting(false);
|
||||||
addRefToPrefixes(takenPrefixes, cmd.getRefName());
|
takenPrefixes.addAll(getPrefixes(cmd.getRefName()));
|
||||||
takenNames.add(cmd.getRefName());
|
takenNames.add(cmd.getRefName());
|
||||||
cmd.setResult(ru.update(walk));
|
cmd.setResult(ru.update(walk));
|
||||||
}
|
}
|
||||||
|
@ -523,29 +523,26 @@ public void execute(RevWalk walk, ProgressMonitor monitor)
|
||||||
execute(walk, monitor, null);
|
execute(walk, monitor, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Collection<String> getTakenPrefixes(
|
private static Collection<String> getTakenPrefixes(Collection<String> names) {
|
||||||
final Collection<String> names) {
|
|
||||||
Collection<String> ref = new HashSet<>();
|
Collection<String> ref = new HashSet<>();
|
||||||
for (String name : names)
|
for (String name : names) {
|
||||||
ref.addAll(getPrefixes(name));
|
addPrefixesTo(name, ref);
|
||||||
return ref;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void addRefToPrefixes(Collection<String> prefixes,
|
|
||||||
String name) {
|
|
||||||
for (String prefix : getPrefixes(name)) {
|
|
||||||
prefixes.add(prefix);
|
|
||||||
}
|
}
|
||||||
|
return ref;
|
||||||
}
|
}
|
||||||
|
|
||||||
static Collection<String> getPrefixes(String s) {
|
static Collection<String> getPrefixes(String s) {
|
||||||
Collection<String> ret = new HashSet<>();
|
Collection<String> ret = new HashSet<>();
|
||||||
|
addPrefixesTo(s, ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void addPrefixesTo(String s, Collection<String> out) {
|
||||||
int p1 = s.indexOf('/');
|
int p1 = s.indexOf('/');
|
||||||
while (p1 > 0) {
|
while (p1 > 0) {
|
||||||
ret.add(s.substring(0, p1));
|
out.add(s.substring(0, p1));
|
||||||
p1 = s.indexOf('/', p1 + 1);
|
p1 = s.indexOf('/', p1 + 1);
|
||||||
}
|
}
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -338,10 +338,11 @@ public Builder() {
|
||||||
* Create an empty list with at least the specified capacity.
|
* Create an empty list with at least the specified capacity.
|
||||||
*
|
*
|
||||||
* @param capacity
|
* @param capacity
|
||||||
* the new capacity.
|
* the new capacity; if zero or negative, behavior is the same as
|
||||||
|
* {@link #Builder()}.
|
||||||
*/
|
*/
|
||||||
public Builder(int capacity) {
|
public Builder(int capacity) {
|
||||||
list = new Ref[capacity];
|
list = new Ref[Math.max(capacity, 16)];
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @return number of items in this builder's internal collection. */
|
/** @return number of items in this builder's internal collection. */
|
||||||
|
|
Loading…
Reference in New Issue