]> source.dussan.org Git - jgit.git/commitdiff
[push, lfs] Tell the pre-push hook whether the push is a dry run 30/191930/3
authorThomas Wolf <thomas.wolf@paranor.ch>
Sun, 20 Feb 2022 23:20:52 +0000 (00:20 +0100)
committerMatthias Sohn <matthias.sohn@sap.com>
Wed, 23 Mar 2022 22:55:31 +0000 (18:55 -0400)
This is a feature that does not exist in C git: an external pre-push
hook doesn't know whether the push is run as a dry run. But for
internal hooks written in Java it is entirely possible to give a hook
this information.

In JGit with its internal LFS implementation, this enables us to not
perform LFS uploads in a dry run. This is kind of important because
EGit frequently does a dry-run before doing the actual push to give the
user a way to review what would be pushed before it actually happens.

Doing an LFS upload of potentially huge files during a dry-run is
wasteful, makes the dry run not actually a dry run, and leads to
uploading the same file twice if followed by a real push.

Use the information in the LfsPrePushHook to only do the initial call
to the LFS server, but then skipping the actual upload if the push is
a dry run. That way, a failure to contact the LFS server leads to an
error in the dry run, as it should.

Bug: 546567
Change-Id: I155430f27c4979d91096ba72fd95c3775dd3f28b
Signed-off-by: Thomas Wolf <thomas.wolf@paranor.ch>
org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/LfsPrePushHook.java
org.eclipse.jgit/src/org/eclipse/jgit/hooks/PrePushHook.java
org.eclipse.jgit/src/org/eclipse/jgit/transport/PushProcess.java

index ebf46e080ebe0c6fae7399b1d8879c98651bfb1e..9b3d60812a0e3a915515c2639844b7b709032b11 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2017, Markus Duft <markus.duft@ssi-schaefer.com> and others
+ * Copyright (C) 2017, 2022 Markus Duft <markus.duft@ssi-schaefer.com> 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
@@ -101,8 +101,10 @@ public class LfsPrePushHook extends PrePushHook {
                }
                HttpConnection api = LfsConnectionFactory.getLfsConnection(
                                getRepository(), METHOD_POST, OPERATION_UPLOAD);
-               Map<String, LfsPointer> oid2ptr = requestBatchUpload(api, toPush);
-               uploadContents(api, oid2ptr);
+               if (!isDryRun()) {
+                       Map<String, LfsPointer> oid2ptr = requestBatchUpload(api, toPush);
+                       uploadContents(api, oid2ptr);
+               }
                return EMPTY;
 
        }
index 535c6b9483093c8a1c375239942c1ed1ea28836e..43dbc37f4f36688da901497abd17501b682c8e63 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2015 Obeo. and others
+ * Copyright (C) 2015, 2022 Obeo 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
@@ -38,6 +38,8 @@ public class PrePushHook extends GitHook<String> {
 
        private String refs;
 
+       private boolean dryRun;
+
        /**
         * Constructor for PrePushHook
         * <p>
@@ -144,6 +146,27 @@ public class PrePushHook extends GitHook<String> {
                remoteLocation = location;
        }
 
+       /**
+        * Sets whether the push is a dry run.
+        *
+        * @param dryRun
+        *            {@code true} if the push is a dry run, {@code false} otherwise
+        * @since 6.2
+        */
+       public void setDryRun(boolean dryRun) {
+               this.dryRun = dryRun;
+       }
+
+       /**
+        * Tells whether the push is a dry run.
+        *
+        * @return {@code true} if the push is a dry run, {@code false} otherwise
+        * @since 6.2
+        */
+       protected boolean isDryRun() {
+               return dryRun;
+       }
+
        /**
         * Set Refs
         *
index 942dad46e0024b2ac6f56462b721942157863006..b59ae0c4504e879f6baa15df0155ebec7235baa0 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008, Marek Zawirski <marek.zawirski@gmail.com> and others
+ * Copyright (C) 2008, 2022 Marek Zawirski <marek.zawirski@gmail.com> 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
@@ -166,6 +166,7 @@ class PushProcess {
                                        if (prePush != null) {
                                                try {
                                                        prePush.setRefs(willBeAttempted);
+                                                       prePush.setDryRun(transport.isDryRun());
                                                        prePush.call();
                                                } catch (AbortedByHookException | IOException e) {
                                                        throw new TransportException(e.getMessage(), e);