Message ID | 20200623202129.2616672-1-sandals@crustytoothpaste.net (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | http-push: ensure unforced pushes fail when data would be lost | expand |
On Tue, Jun 23, 2020 at 5:23 PM brian m. carlson <sandals@crustytoothpaste.net> wrote: > When we push using the DAV-based protocol, the client is the one that > performs the ref updates and therefore makes the checks to see whether > an unforced push should be allowed. We make this check by determining > if either (a) we lack the object file for the old value of the ref or > (b) the new value of the ref is not newer than the old value, and in > either case, reject the push. > [...] > Signed-off-by: René Scharfe <l.s.r@web.de> > Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net> Do you want a "Reported-by: Michael Ward <mward@smartsoftwareinc.com>" in this vicinity?
On 2020-06-23 at 21:28:43, Eric Sunshine wrote: > On Tue, Jun 23, 2020 at 5:23 PM brian m. carlson > <sandals@crustytoothpaste.net> wrote: > > When we push using the DAV-based protocol, the client is the one that > > performs the ref updates and therefore makes the checks to see whether > > an unforced push should be allowed. We make this check by determining > > if either (a) we lack the object file for the old value of the ref or > > (b) the new value of the ref is not newer than the old value, and in > > either case, reject the push. > > [...] > > Signed-off-by: René Scharfe <l.s.r@web.de> > > Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net> > > Do you want a "Reported-by: Michael Ward <mward@smartsoftwareinc.com>" > in this vicinity? Yes, we do. Thanks for reminding me.
diff --git a/http-push.c b/http-push.c index 822f326599..99adbebdcf 100644 --- a/http-push.c +++ b/http-push.c @@ -70,10 +70,10 @@ enum XML_Status { #define LOCK_REFRESH 30 /* Remember to update object flag allocation in object.h */ -#define LOCAL (1u<<16) -#define REMOTE (1u<<17) -#define FETCHING (1u<<18) -#define PUSHING (1u<<19) +#define LOCAL (1u<<11) +#define REMOTE (1u<<12) +#define FETCHING (1u<<13) +#define PUSHING (1u<<14) /* We allow "recursive" symbolic refs. Only within reason, though */ #define MAXDEPTH 5 diff --git a/object.h b/object.h index b22328b838..a496d2e4e1 100644 --- a/object.h +++ b/object.h @@ -67,7 +67,7 @@ struct object_array { * builtin/blame.c: 12-13 * bisect.c: 16 * bundle.c: 16 - * http-push.c: 16-----19 + * http-push.c: 11-----14 * commit-graph.c: 15 * commit-reach.c: 16-----19 * sha1-name.c: 20 diff --git a/t/t5540-http-push-webdav.sh b/t/t5540-http-push-webdav.sh index d476c33509..450321fddb 100755 --- a/t/t5540-http-push-webdav.sh +++ b/t/t5540-http-push-webdav.sh @@ -126,6 +126,22 @@ test_expect_success 'create and delete remote branch' ' test_must_fail git show-ref --verify refs/remotes/origin/dev ' +test_expect_success 'non-force push fails if not up to date' ' + git init --bare "$HTTPD_DOCUMENT_ROOT_PATH"/test_repo_conflict.git && + git -C "$HTTPD_DOCUMENT_ROOT_PATH"/test_repo_conflict.git update-server-info && + git clone $HTTPD_URL/dumb/test_repo_conflict.git "$ROOT_PATH"/c1 && + git clone $HTTPD_URL/dumb/test_repo_conflict.git "$ROOT_PATH"/c2 && + test_commit -C "$ROOT_PATH/c1" path1 && + git -C "$ROOT_PATH/c1" push origin HEAD && + git -C "$ROOT_PATH/c2" pull && + test_commit -C "$ROOT_PATH/c1" path2 && + git -C "$ROOT_PATH/c1" push origin HEAD && + test_commit -C "$ROOT_PATH/c2" path3 && + git -C "$ROOT_PATH/c1" log --graph --all && + git -C "$ROOT_PATH/c2" log --graph --all && + test_must_fail git -C "$ROOT_PATH/c2" push origin HEAD +' + test_expect_success 'MKCOL sends directory names with trailing slashes' ' ! grep "\"MKCOL.*[^/] HTTP/[^ ]*\"" < "$HTTPD_ROOT_PATH"/access.log