extend network protocol to stop clients from locking servers
now all repositories have capabilities slot, tuple with list of names.
if 'unbundle' capability present, repo supports push where client does
not need to lock server. repository classes that have unbundle capability
also have unbundle method.
implemented for ssh now, will be base for push over http.
unbundle protocol acts this way. server tells client what heads it
has during normal negotiate step. client starts unbundle by repeat
server's heads back to it. if server has new heads, abort immediately.
otherwise, transfer changes to server. once data transferred, server
locks and checks heads again. if heads same, changes can be added.
else someone else added heads, and server aborts.
if client wants to force server to add heads, sends special heads list of
'force'.
not removing foo: file is not managed
abort: no files specified
undeleting foo
removing foo
# HG changeset patch
# User test
# Date 1000000 0
# Node ID 8ba83d44753d6259db5ce6524974dd1174e90f47
# Parent 0000000000000000000000000000000000000000
1
diff -r 000000000000 -r 8ba83d44753d foo
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/foo Mon Jan 12 13:46:40 1970 +0000
@@ -0,0 +1,1 @@
+a
# HG changeset patch
# User test
# Date 1000000 0
# Node ID a1fce69c50d97881c5c014ab23f580f720c78678
# Parent 8ba83d44753d6259db5ce6524974dd1174e90f47
2
diff -r 8ba83d44753d -r a1fce69c50d9 foo
--- a/foo Mon Jan 12 13:46:40 1970 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-a
changeset: 0:8ba83d44753d
user: test
date: Mon Jan 12 13:46:40 1970 +0000
summary: 1
diff -r 000000000000 -r 8ba83d44753d foo
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/foo Mon Jan 12 13:46:40 1970 +0000
@@ -0,0 +1,1 @@
+a
changeset: 1:a1fce69c50d9
tag: tip
user: test
date: Mon Jan 12 13:46:40 1970 +0000
summary: 2
diff -r 8ba83d44753d -r a1fce69c50d9 foo
--- a/foo Mon Jan 12 13:46:40 1970 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-a
not removing a: file has been marked for add (use -f to force removal)
adding a
adding b
not removing b: file is modified (use -f to force removal)
2 files updated, 0 files merged, 0 files removed, 0 files unresolved