]> source.dussan.org Git - jgit.git/commitdiff
Short-circuit writing packed-refs if no refs were packed 66/100766/1
authorDave Borowitz <dborowitz@google.com>
Wed, 5 Jul 2017 16:16:56 +0000 (12:16 -0400)
committerDave Borowitz <dborowitz@google.com>
Wed, 5 Jul 2017 19:51:26 +0000 (15:51 -0400)
Change-Id: Id691905599b242e48f590138a96e0c86132308fd

org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/RefDirectory.java

index 24d51a5ea65b4037e7960ed516a4f8bb3de179e8..5d66a4fbd39917c9a302fc7250e5c4a736e221f8 100644 (file)
@@ -647,16 +647,32 @@ public class RefDirectory extends RefDatabase {
                        RefList<Ref> cur = readPackedRefs();
 
                        // Iterate over all refs to be packed
+                       boolean dirty = false;
                        for (String refName : refs) {
-                               Ref ref = readRef(refName, cur);
-                               if (ref.isSymbolic())
+                               Ref oldRef = readRef(refName, cur);
+                               if (oldRef.isSymbolic()) {
                                        continue; // can't pack symbolic 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);
-                               if (idx >= 0)
-                                       cur = cur.set(idx, peeledPackedRef(ref));
-                               else
-                                       cur = cur.add(idx, peeledPackedRef(ref));
+                               if (idx >= 0) {
+                                       cur = cur.set(idx, newRef);
+                               } else {
+                                       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.