##// END OF EJS Templates
add preoutgoing and outgoing hooks....
Vadim Gelfer -
r1736:50de0887 default
parent child Browse files
Show More
@@ -160,6 +160,10 b' hooks::'
160 Run after a changeset has been pulled, pushed, or unbundled into
160 Run after a changeset has been pulled, pushed, or unbundled into
161 the local repository. The ID of the newly arrived changeset is in
161 the local repository. The ID of the newly arrived changeset is in
162 $HG_NODE.
162 $HG_NODE.
163 outgoing;;
164 Run after sending changes from local repository to another. ID of
165 first changeset sent is in $HG_NODE. Source of operation is in
166 $HG_SOURCE; see "preoutgoing" hook for description.
163 prechangegroup;;
167 prechangegroup;;
164 Run before a changegroup is added via push, pull or unbundle.
168 Run before a changegroup is added via push, pull or unbundle.
165 Exit status 0 allows the changegroup to proceed. Non-zero status
169 Exit status 0 allows the changegroup to proceed. Non-zero status
@@ -168,6 +172,15 b' hooks::'
168 Run before starting a local commit. Exit status 0 allows the
172 Run before starting a local commit. Exit status 0 allows the
169 commit to proceed. Non-zero status will cause the commit to fail.
173 commit to proceed. Non-zero status will cause the commit to fail.
170 Parent changeset IDs are in $HG_PARENT1 and $HG_PARENT2.
174 Parent changeset IDs are in $HG_PARENT1 and $HG_PARENT2.
175 preoutgoing;;
176 Run before computing changes to send from the local repository to
177 another. Non-zero status will cause failure. This lets you
178 prevent pull over http or ssh. Also prevents against local pull,
179 push (outbound) or bundle commands, but not effective, since you
180 can just copy files instead then. Source of operation is in
181 $HG_SOURCE. If "serve", operation is happening on behalf of
182 remote ssh or http repository. If "push", "pull" or "bundle",
183 operation is happening on behalf of repository on same system.
171 pretag;;
184 pretag;;
172 Run before creating a tag. Exit status 0 allows the tag to be
185 Run before creating a tag. Exit status 0 allows the tag to be
173 created. Non-zero status will cause the tag to fail. ID of
186 created. Non-zero status will cause the tag to fail. ID of
@@ -622,7 +622,7 b' def bundle(ui, repo, fname, dest="defaul'
622 dest = ui.expandpath(dest, repo.root)
622 dest = ui.expandpath(dest, repo.root)
623 other = hg.repository(ui, dest)
623 other = hg.repository(ui, dest)
624 o = repo.findoutgoing(other)
624 o = repo.findoutgoing(other)
625 cg = repo.changegroup(o)
625 cg = repo.changegroup(o, 'bundle')
626
626
627 try:
627 try:
628 f.write("HG10")
628 f.write("HG10")
@@ -1999,7 +1999,7 b' def serve(ui, repo, **opts):'
1999 arg, roots = getarg()
1999 arg, roots = getarg()
2000 nodes = map(bin, roots.split(" "))
2000 nodes = map(bin, roots.split(" "))
2001
2001
2002 cg = repo.changegroup(nodes)
2002 cg = repo.changegroup(nodes, 'serve')
2003 while 1:
2003 while 1:
2004 d = cg.read(4096)
2004 d = cg.read(4096)
2005 if not d:
2005 if not d:
@@ -962,7 +962,7 b' class hgweb(object):'
962 nodes = map(bin, req.form['roots'][0].split(" "))
962 nodes = map(bin, req.form['roots'][0].split(" "))
963
963
964 z = zlib.compressobj()
964 z = zlib.compressobj()
965 f = self.repo.changegroup(nodes)
965 f = self.repo.changegroup(nodes, 'serve')
966 while 1:
966 while 1:
967 chunk = f.read(4096)
967 chunk = f.read(4096)
968 if not chunk:
968 if not chunk:
@@ -119,7 +119,7 b' class httprepository(remoterepository):'
119 self.ui.warn(_("unexpected response:\n") + d[:400] + "\n...\n")
119 self.ui.warn(_("unexpected response:\n") + d[:400] + "\n...\n")
120 raise
120 raise
121
121
122 def changegroup(self, nodes):
122 def changegroup(self, nodes, kind):
123 n = " ".join(map(hex, nodes))
123 n = " ".join(map(hex, nodes))
124 f = self.do_cmd("changegroup", roots=n)
124 f = self.do_cmd("changegroup", roots=n)
125 bytes = 0
125 bytes = 0
@@ -957,9 +957,9 b' class localrepository(object):'
957 return 1
957 return 1
958
958
959 if heads is None:
959 if heads is None:
960 cg = remote.changegroup(fetch)
960 cg = remote.changegroup(fetch, 'pull')
961 else:
961 else:
962 cg = remote.changegroupsubset(fetch, heads)
962 cg = remote.changegroupsubset(fetch, heads, 'pull')
963 return self.addchangegroup(cg)
963 return self.addchangegroup(cg)
964
964
965 def push(self, remote, force=False):
965 def push(self, remote, force=False):
@@ -984,10 +984,10 b' class localrepository(object):'
984 " use push -f to force)\n"))
984 " use push -f to force)\n"))
985 return 1
985 return 1
986
986
987 cg = self.changegroup(update)
987 cg = self.changegroup(update, 'push')
988 return remote.addchangegroup(cg)
988 return remote.addchangegroup(cg)
989
989
990 def changegroupsubset(self, bases, heads):
990 def changegroupsubset(self, bases, heads, source):
991 """This function generates a changegroup consisting of all the nodes
991 """This function generates a changegroup consisting of all the nodes
992 that are descendents of any of the bases, and ancestors of any of
992 that are descendents of any of the bases, and ancestors of any of
993 the heads.
993 the heads.
@@ -999,6 +999,8 b' class localrepository(object):'
999 Another wrinkle is doing the reverse, figuring out which changeset in
999 Another wrinkle is doing the reverse, figuring out which changeset in
1000 the changegroup a particular filenode or manifestnode belongs to."""
1000 the changegroup a particular filenode or manifestnode belongs to."""
1001
1001
1002 self.hook('preoutgoing', throw=True, source=source)
1003
1002 # Set up some initial variables
1004 # Set up some initial variables
1003 # Make it easy to refer to self.changelog
1005 # Make it easy to refer to self.changelog
1004 cl = self.changelog
1006 cl = self.changelog
@@ -1251,14 +1253,19 b' class localrepository(object):'
1251 # Signal that no more groups are left.
1253 # Signal that no more groups are left.
1252 yield struct.pack(">l", 0)
1254 yield struct.pack(">l", 0)
1253
1255
1256 self.hook('outgoing', node=hex(msng_cl_lst[0]), source=source)
1257
1254 return util.chunkbuffer(gengroup())
1258 return util.chunkbuffer(gengroup())
1255
1259
1256 def changegroup(self, basenodes):
1260 def changegroup(self, basenodes, source):
1257 """Generate a changegroup of all nodes that we have that a recipient
1261 """Generate a changegroup of all nodes that we have that a recipient
1258 doesn't.
1262 doesn't.
1259
1263
1260 This is much easier than the previous function as we can assume that
1264 This is much easier than the previous function as we can assume that
1261 the recipient has any changenode we aren't sending them."""
1265 the recipient has any changenode we aren't sending them."""
1266
1267 self.hook('preoutgoing', throw=True, source=source)
1268
1262 cl = self.changelog
1269 cl = self.changelog
1263 nodes = cl.nodesbetween(basenodes, None)[0]
1270 nodes = cl.nodesbetween(basenodes, None)[0]
1264 revset = dict.fromkeys([cl.rev(n) for n in nodes])
1271 revset = dict.fromkeys([cl.rev(n) for n in nodes])
@@ -1310,6 +1317,7 b' class localrepository(object):'
1310 yield chnk
1317 yield chnk
1311
1318
1312 yield struct.pack(">l", 0)
1319 yield struct.pack(">l", 0)
1320 self.hook('outgoing', node=hex(nodes[0]), source=source)
1313
1321
1314 return util.chunkbuffer(gengroup())
1322 return util.chunkbuffer(gengroup())
1315
1323
@@ -110,7 +110,7 b' class sshrepository(remoterepository):'
110 except:
110 except:
111 raise hg.RepoError(_("unexpected response '%s'") % (d[:400] + "..."))
111 raise hg.RepoError(_("unexpected response '%s'") % (d[:400] + "..."))
112
112
113 def changegroup(self, nodes):
113 def changegroup(self, nodes, kind):
114 n = " ".join(map(hex, nodes))
114 n = " ".join(map(hex, nodes))
115 f = self.do_cmd("changegroup", roots=n)
115 f = self.do_cmd("changegroup", roots=n)
116 return self.pipei
116 return self.pipei
@@ -74,3 +74,17 b" echo '[hooks]' > .hg/hgrc"
74 echo 'pretxnchangegroup.forbid = echo pretxnchangegroup.forbid hook: tip=`hg -q tip`; exit 1' >> .hg/hgrc
74 echo 'pretxnchangegroup.forbid = echo pretxnchangegroup.forbid hook: tip=`hg -q tip`; exit 1' >> .hg/hgrc
75 hg pull ../a
75 hg pull ../a
76 hg -q tip
76 hg -q tip
77
78 # outgoing hooks can see env vars
79 rm .hg/hgrc
80 echo '[hooks]' > ../a/.hg/hgrc
81 echo 'preoutgoing = echo preoutgoing hook: s=$HG_SOURCE' >> ../a/.hg/hgrc
82 echo 'outgoing = echo outgoing hook: n=$HG_NODE s=$HG_SOURCE' >> ../a/.hg/hgrc
83 hg pull ../a
84 hg undo
85
86 # preoutgoing hook can prevent outgoing changes
87 echo 'preoutgoing.forbid = echo preoutgoing.forbid hook; exit 1' >> ../a/.hg/hgrc
88 hg pull ../a
89
90 exit 0
@@ -71,3 +71,18 b' abort: pretxnchangegroup.forbid hook exi'
71 transaction abort!
71 transaction abort!
72 rollback completed
72 rollback completed
73 3:07f3376c1e65
73 3:07f3376c1e65
74 preoutgoing hook: s=pull
75 outgoing hook: n=3cd2c6a5a36c5908aad3bc0d717c29873a05dfc2 s=pull
76 pulling from ../a
77 searching for changes
78 adding changesets
79 adding manifests
80 adding file changes
81 added 1 changesets with 1 changes to 1 files
82 (run 'hg update' to get a working copy)
83 rolling back last transaction
84 preoutgoing hook: s=pull
85 preoutgoing.forbid hook
86 pulling from ../a
87 searching for changes
88 abort: preoutgoing.forbid hook exited with status 1
General Comments 0
You need to be logged in to leave comments. Login now