Show More
@@ -0,0 +1,292 b'' | |||||
|
1 | $ hg init | |||
|
2 | ||||
|
3 | Setup: | |||
|
4 | ||||
|
5 | $ echo a >> a | |||
|
6 | $ hg ci -Am 'base' | |||
|
7 | adding a | |||
|
8 | ||||
|
9 | Refuse to amend public csets: | |||
|
10 | ||||
|
11 | $ hg phase -r . -p | |||
|
12 | $ hg ci --amend | |||
|
13 | abort: cannot amend public changesets | |||
|
14 | [255] | |||
|
15 | $ hg phase -r . -f -d | |||
|
16 | ||||
|
17 | $ echo a >> a | |||
|
18 | $ hg ci -Am 'base1' | |||
|
19 | ||||
|
20 | Nothing to amend: | |||
|
21 | ||||
|
22 | $ hg ci --amend | |||
|
23 | nothing changed | |||
|
24 | [1] | |||
|
25 | ||||
|
26 | Amending changeset with changes in working dir: | |||
|
27 | ||||
|
28 | $ echo a >> a | |||
|
29 | $ hg ci --amend -m 'amend base1' | |||
|
30 | saved backup bundle to $TESTTMP/.hg/strip-backup/489edb5b847d-amend-backup.hg | |||
|
31 | $ hg diff -c . | |||
|
32 | diff -r ad120869acf0 -r 9cd25b479c51 a | |||
|
33 | --- a/a Thu Jan 01 00:00:00 1970 +0000 | |||
|
34 | +++ b/a Thu Jan 01 00:00:00 1970 +0000 | |||
|
35 | @@ -1,1 +1,3 @@ | |||
|
36 | a | |||
|
37 | +a | |||
|
38 | +a | |||
|
39 | $ hg log | |||
|
40 | changeset: 1:9cd25b479c51 | |||
|
41 | tag: tip | |||
|
42 | user: test | |||
|
43 | date: Thu Jan 01 00:00:00 1970 +0000 | |||
|
44 | summary: amend base1 | |||
|
45 | ||||
|
46 | changeset: 0:ad120869acf0 | |||
|
47 | user: test | |||
|
48 | date: Thu Jan 01 00:00:00 1970 +0000 | |||
|
49 | summary: base | |||
|
50 | ||||
|
51 | ||||
|
52 | Add new file: | |||
|
53 | ||||
|
54 | $ echo b > b | |||
|
55 | $ hg ci --amend -Am 'amend base1 new file' | |||
|
56 | adding b | |||
|
57 | saved backup bundle to $TESTTMP/.hg/strip-backup/9cd25b479c51-amend-backup.hg | |||
|
58 | ||||
|
59 | Remove file that was added in amended commit: | |||
|
60 | ||||
|
61 | $ hg rm b | |||
|
62 | $ hg ci --amend -m 'amend base1 remove new file' | |||
|
63 | saved backup bundle to $TESTTMP/.hg/strip-backup/e2bb3ecffd2f-amend-backup.hg | |||
|
64 | ||||
|
65 | $ hg cat b | |||
|
66 | b: no such file in rev 664a9b2d60cd | |||
|
67 | [1] | |||
|
68 | ||||
|
69 | No changes, just a different message: | |||
|
70 | ||||
|
71 | $ hg ci -v --amend -m 'no changes, new message' | |||
|
72 | amending changeset 664a9b2d60cd | |||
|
73 | copying changeset 664a9b2d60cd to ad120869acf0 | |||
|
74 | a | |||
|
75 | stripping amended changeset 664a9b2d60cd | |||
|
76 | 1 changesets found | |||
|
77 | saved backup bundle to $TESTTMP/.hg/strip-backup/664a9b2d60cd-amend-backup.hg | |||
|
78 | 1 changesets found | |||
|
79 | adding branch | |||
|
80 | adding changesets | |||
|
81 | adding manifests | |||
|
82 | adding file changes | |||
|
83 | added 1 changesets with 1 changes to 1 files | |||
|
84 | committed changeset 1:ea6e356ff2ad | |||
|
85 | $ hg diff -c . | |||
|
86 | diff -r ad120869acf0 -r ea6e356ff2ad a | |||
|
87 | --- a/a Thu Jan 01 00:00:00 1970 +0000 | |||
|
88 | +++ b/a Thu Jan 01 00:00:00 1970 +0000 | |||
|
89 | @@ -1,1 +1,3 @@ | |||
|
90 | a | |||
|
91 | +a | |||
|
92 | +a | |||
|
93 | $ hg log | |||
|
94 | changeset: 1:ea6e356ff2ad | |||
|
95 | tag: tip | |||
|
96 | user: test | |||
|
97 | date: Thu Jan 01 00:00:00 1970 +0000 | |||
|
98 | summary: no changes, new message | |||
|
99 | ||||
|
100 | changeset: 0:ad120869acf0 | |||
|
101 | user: test | |||
|
102 | date: Thu Jan 01 00:00:00 1970 +0000 | |||
|
103 | summary: base | |||
|
104 | ||||
|
105 | ||||
|
106 | Disable default date on commit so when -d isn't given, the old date is preserved: | |||
|
107 | ||||
|
108 | $ echo '[defaults]' >> $HGRCPATH | |||
|
109 | $ echo 'commit=' >> $HGRCPATH | |||
|
110 | ||||
|
111 | Test -u/-d: | |||
|
112 | ||||
|
113 | $ hg ci --amend -u foo -d '1 0' | |||
|
114 | saved backup bundle to $TESTTMP/.hg/strip-backup/ea6e356ff2ad-amend-backup.hg | |||
|
115 | $ echo a >> a | |||
|
116 | $ hg ci --amend -u foo -d '1 0' | |||
|
117 | saved backup bundle to $TESTTMP/.hg/strip-backup/377b91ce8b56-amend-backup.hg | |||
|
118 | $ hg log -r . | |||
|
119 | changeset: 1:2c94e4a5756f | |||
|
120 | tag: tip | |||
|
121 | user: foo | |||
|
122 | date: Thu Jan 01 00:00:01 1970 +0000 | |||
|
123 | summary: no changes, new message | |||
|
124 | ||||
|
125 | ||||
|
126 | Open editor with old commit message if a message isn't given otherwise: | |||
|
127 | ||||
|
128 | $ cat > editor << '__EOF__' | |||
|
129 | > #!/bin/sh | |||
|
130 | > cat $1 | |||
|
131 | > echo "another precious commit message" > "$1" | |||
|
132 | > __EOF__ | |||
|
133 | $ chmod +x editor | |||
|
134 | $ HGEDITOR="'`pwd`'"/editor hg commit --amend -v | |||
|
135 | amending changeset 2c94e4a5756f | |||
|
136 | copying changeset 2c94e4a5756f to ad120869acf0 | |||
|
137 | no changes, new message | |||
|
138 | ||||
|
139 | ||||
|
140 | HG: Enter commit message. Lines beginning with 'HG:' are removed. | |||
|
141 | HG: Leave message empty to abort commit. | |||
|
142 | HG: -- | |||
|
143 | HG: user: foo | |||
|
144 | HG: branch 'default' | |||
|
145 | HG: changed a | |||
|
146 | a | |||
|
147 | stripping amended changeset 2c94e4a5756f | |||
|
148 | 1 changesets found | |||
|
149 | saved backup bundle to $TESTTMP/.hg/strip-backup/2c94e4a5756f-amend-backup.hg | |||
|
150 | 1 changesets found | |||
|
151 | adding branch | |||
|
152 | adding changesets | |||
|
153 | adding manifests | |||
|
154 | adding file changes | |||
|
155 | added 1 changesets with 1 changes to 1 files | |||
|
156 | committed changeset 1:ffb49186f961 | |||
|
157 | ||||
|
158 | Same, but with changes in working dir (different code path): | |||
|
159 | ||||
|
160 | $ echo a >> a | |||
|
161 | $ HGEDITOR="'`pwd`'"/editor hg commit --amend -v | |||
|
162 | amending changeset ffb49186f961 | |||
|
163 | another precious commit message | |||
|
164 | ||||
|
165 | ||||
|
166 | HG: Enter commit message. Lines beginning with 'HG:' are removed. | |||
|
167 | HG: Leave message empty to abort commit. | |||
|
168 | HG: -- | |||
|
169 | HG: user: foo | |||
|
170 | HG: branch 'default' | |||
|
171 | HG: changed a | |||
|
172 | a | |||
|
173 | copying changeset 27f3aacd3011 to ad120869acf0 | |||
|
174 | a | |||
|
175 | stripping intermediate changeset 27f3aacd3011 | |||
|
176 | stripping amended changeset ffb49186f961 | |||
|
177 | 2 changesets found | |||
|
178 | saved backup bundle to $TESTTMP/.hg/strip-backup/ffb49186f961-amend-backup.hg | |||
|
179 | 1 changesets found | |||
|
180 | adding branch | |||
|
181 | adding changesets | |||
|
182 | adding manifests | |||
|
183 | adding file changes | |||
|
184 | added 1 changesets with 1 changes to 1 files | |||
|
185 | committed changeset 1:fb6cca43446f | |||
|
186 | ||||
|
187 | $ rm editor | |||
|
188 | $ hg log -r . | |||
|
189 | changeset: 1:fb6cca43446f | |||
|
190 | tag: tip | |||
|
191 | user: foo | |||
|
192 | date: Thu Jan 01 00:00:01 1970 +0000 | |||
|
193 | summary: another precious commit message | |||
|
194 | ||||
|
195 | ||||
|
196 | Moving bookmarks, preserve active bookmark: | |||
|
197 | ||||
|
198 | $ hg book book1 | |||
|
199 | $ hg book book2 | |||
|
200 | $ hg ci --amend -m 'move bookmarks' | |||
|
201 | saved backup bundle to $TESTTMP/.hg/strip-backup/fb6cca43446f-amend-backup.hg | |||
|
202 | $ hg book | |||
|
203 | book1 1:0cf1c7a51bcf | |||
|
204 | * book2 1:0cf1c7a51bcf | |||
|
205 | $ echo a >> a | |||
|
206 | $ hg ci --amend -m 'move bookmarks' | |||
|
207 | saved backup bundle to $TESTTMP/.hg/strip-backup/0cf1c7a51bcf-amend-backup.hg | |||
|
208 | $ hg book | |||
|
209 | book1 1:7344472bd951 | |||
|
210 | * book2 1:7344472bd951 | |||
|
211 | ||||
|
212 | $ echo '[defaults]' >> $HGRCPATH | |||
|
213 | $ echo "commit=-d '0 0'" >> $HGRCPATH | |||
|
214 | ||||
|
215 | Moving branches: | |||
|
216 | ||||
|
217 | $ hg branch foo | |||
|
218 | marked working directory as branch foo | |||
|
219 | (branches are permanent and global, did you want a bookmark?) | |||
|
220 | $ echo a >> a | |||
|
221 | $ hg ci -m 'branch foo' | |||
|
222 | $ hg branch default -f | |||
|
223 | marked working directory as branch default | |||
|
224 | (branches are permanent and global, did you want a bookmark?) | |||
|
225 | $ hg ci --amend -m 'back to default' | |||
|
226 | saved backup bundle to $TESTTMP/.hg/strip-backup/1661ca36a2db-amend-backup.hg | |||
|
227 | $ hg branches | |||
|
228 | default 2:f24ee5961967 | |||
|
229 | ||||
|
230 | Close branch: | |||
|
231 | ||||
|
232 | $ hg up -q 0 | |||
|
233 | $ echo b >> b | |||
|
234 | $ hg branch foo | |||
|
235 | marked working directory as branch foo | |||
|
236 | (branches are permanent and global, did you want a bookmark?) | |||
|
237 | $ hg ci -Am 'fork' | |||
|
238 | adding b | |||
|
239 | $ echo b >> b | |||
|
240 | $ hg ci -mb | |||
|
241 | $ hg ci --amend --close-branch -m 'closing branch foo' | |||
|
242 | saved backup bundle to $TESTTMP/.hg/strip-backup/c962248fa264-amend-backup.hg | |||
|
243 | ||||
|
244 | Same thing, different code path: | |||
|
245 | ||||
|
246 | $ echo b >> b | |||
|
247 | $ hg ci -m 'reopen branch' | |||
|
248 | reopening closed branch head 4 | |||
|
249 | $ echo b >> b | |||
|
250 | $ hg ci --amend --close-branch | |||
|
251 | saved backup bundle to $TESTTMP/.hg/strip-backup/5e302dcc12b8-amend-backup.hg | |||
|
252 | $ hg branches | |||
|
253 | default 2:f24ee5961967 | |||
|
254 | ||||
|
255 | Refuse to amend merges: | |||
|
256 | ||||
|
257 | $ hg up -q default | |||
|
258 | $ hg merge foo | |||
|
259 | 1 files updated, 0 files merged, 0 files removed, 0 files unresolved | |||
|
260 | (branch merge, don't forget to commit) | |||
|
261 | $ hg ci --amend | |||
|
262 | abort: cannot amend while merging | |||
|
263 | [255] | |||
|
264 | $ hg ci -m 'merge' | |||
|
265 | $ hg ci --amend | |||
|
266 | abort: cannot amend merge changesets | |||
|
267 | [255] | |||
|
268 | ||||
|
269 | Follow copies/renames: | |||
|
270 | ||||
|
271 | $ hg mv b c | |||
|
272 | $ hg ci -m 'b -> c' | |||
|
273 | $ hg mv c d | |||
|
274 | $ hg ci --amend -m 'b -> d' | |||
|
275 | saved backup bundle to $TESTTMP/.hg/strip-backup/9c207120aa98-amend-backup.hg | |||
|
276 | $ hg st --rev .^ --copies d | |||
|
277 | A d | |||
|
278 | b | |||
|
279 | $ hg cp d e | |||
|
280 | $ hg ci -m 'e = d' | |||
|
281 | $ hg cp e f | |||
|
282 | $ hg ci --amend -m 'f = d' | |||
|
283 | saved backup bundle to $TESTTMP/.hg/strip-backup/fda2b3b27b22-amend-backup.hg | |||
|
284 | $ hg st --rev .^ --copies f | |||
|
285 | A f | |||
|
286 | d | |||
|
287 | ||||
|
288 | Can't rollback an amend: | |||
|
289 | ||||
|
290 | $ hg rollback | |||
|
291 | no rollback information available | |||
|
292 | [1] |
@@ -10,7 +10,7 b' from i18n import _' | |||||
10 | import os, sys, errno, re, tempfile |
|
10 | import os, sys, errno, re, tempfile | |
11 | import util, scmutil, templater, patch, error, templatekw, revlog, copies |
|
11 | import util, scmutil, templater, patch, error, templatekw, revlog, copies | |
12 | import match as matchmod |
|
12 | import match as matchmod | |
13 | import subrepo |
|
13 | import subrepo, context, repair, bookmarks | |
14 |
|
14 | |||
15 | def parsealiases(cmd): |
|
15 | def parsealiases(cmd): | |
16 | return cmd.lstrip("^").split("|") |
|
16 | return cmd.lstrip("^").split("|") | |
@@ -1285,6 +1285,123 b' def commit(ui, repo, commitfunc, pats, o' | |||||
1285 | return commitfunc(ui, repo, message, |
|
1285 | return commitfunc(ui, repo, message, | |
1286 | scmutil.match(repo[None], pats, opts), opts) |
|
1286 | scmutil.match(repo[None], pats, opts), opts) | |
1287 |
|
1287 | |||
|
1288 | def amend(ui, repo, commitfunc, old, extra, pats, opts): | |||
|
1289 | ui.note(_('amending changeset %s\n') % old) | |||
|
1290 | base = old.p1() | |||
|
1291 | ||||
|
1292 | wlock = repo.wlock() | |||
|
1293 | try: | |||
|
1294 | # Fix up dirstate for copies and renames | |||
|
1295 | duplicatecopies(repo, None, base.node()) | |||
|
1296 | ||||
|
1297 | # First, do a regular commit to record all changes in the working | |||
|
1298 | # directory (if there are any) | |||
|
1299 | node = commit(ui, repo, commitfunc, pats, opts) | |||
|
1300 | ctx = repo[node] | |||
|
1301 | ||||
|
1302 | # Participating changesets: | |||
|
1303 | # | |||
|
1304 | # node/ctx o - new (intermediate) commit that contains changes from | |||
|
1305 | # | working dir to go into amending commit (or a workingctx | |||
|
1306 | # | if there were no changes) | |||
|
1307 | # | | |||
|
1308 | # old o - changeset to amend | |||
|
1309 | # | | |||
|
1310 | # base o - parent of amending changeset | |||
|
1311 | ||||
|
1312 | files = set(old.files()) | |||
|
1313 | ||||
|
1314 | # Second, we use either the commit we just did, or if there were no | |||
|
1315 | # changes the parent of the working directory as the version of the | |||
|
1316 | # files in the final amend commit | |||
|
1317 | if node: | |||
|
1318 | ui.note(_('copying changeset %s to %s\n') % (ctx, base)) | |||
|
1319 | ||||
|
1320 | user = ctx.user() | |||
|
1321 | date = ctx.date() | |||
|
1322 | message = ctx.description() | |||
|
1323 | extra = ctx.extra() | |||
|
1324 | ||||
|
1325 | # Prune files which were reverted by the updates: if old introduced | |||
|
1326 | # file X and our intermediate commit, node, renamed that file, then | |||
|
1327 | # those two files are the same and we can discard X from our list | |||
|
1328 | # of files. Likewise if X was deleted, it's no longer relevant | |||
|
1329 | files.update(ctx.files()) | |||
|
1330 | ||||
|
1331 | def samefile(f): | |||
|
1332 | if f in ctx.manifest(): | |||
|
1333 | a = ctx.filectx(f) | |||
|
1334 | if f in base.manifest(): | |||
|
1335 | b = base.filectx(f) | |||
|
1336 | return (a.data() == b.data() | |||
|
1337 | and a.flags() == b.flags() | |||
|
1338 | and a.renamed() == b.renamed()) | |||
|
1339 | else: | |||
|
1340 | return False | |||
|
1341 | else: | |||
|
1342 | return f not in base.manifest() | |||
|
1343 | files = [f for f in files if not samefile(f)] | |||
|
1344 | ||||
|
1345 | def filectxfn(repo, ctx_, path): | |||
|
1346 | try: | |||
|
1347 | return ctx.filectx(path) | |||
|
1348 | except KeyError: | |||
|
1349 | raise IOError() | |||
|
1350 | else: | |||
|
1351 | ui.note(_('copying changeset %s to %s\n') % (old, base)) | |||
|
1352 | ||||
|
1353 | # Use version of files as in the old cset | |||
|
1354 | def filectxfn(repo, ctx_, path): | |||
|
1355 | try: | |||
|
1356 | return old.filectx(path) | |||
|
1357 | except KeyError: | |||
|
1358 | raise IOError() | |||
|
1359 | ||||
|
1360 | # See if we got a message from -m or -l, if not, open the editor | |||
|
1361 | # with the message of the changeset to amend | |||
|
1362 | user = opts.get('user') or old.user() | |||
|
1363 | date = opts.get('date') or old.date() | |||
|
1364 | message = logmessage(ui, opts) | |||
|
1365 | if not message: | |||
|
1366 | cctx = context.workingctx(repo, old.description(), user, date, | |||
|
1367 | extra, | |||
|
1368 | repo.status(base.node(), old.node())) | |||
|
1369 | message = commitforceeditor(repo, cctx, []) | |||
|
1370 | ||||
|
1371 | new = context.memctx(repo, | |||
|
1372 | parents=[base.node(), nullid], | |||
|
1373 | text=message, | |||
|
1374 | files=files, | |||
|
1375 | filectxfn=filectxfn, | |||
|
1376 | user=user, | |||
|
1377 | date=date, | |||
|
1378 | extra=extra) | |||
|
1379 | newid = repo.commitctx(new) | |||
|
1380 | if newid != old.node(): | |||
|
1381 | # Reroute the working copy parent to the new changeset | |||
|
1382 | repo.dirstate.setparents(newid, nullid) | |||
|
1383 | ||||
|
1384 | # Move bookmarks from old parent to amend commit | |||
|
1385 | bms = repo.nodebookmarks(old.node()) | |||
|
1386 | if bms: | |||
|
1387 | for bm in bms: | |||
|
1388 | repo._bookmarks[bm] = newid | |||
|
1389 | bookmarks.write(repo) | |||
|
1390 | ||||
|
1391 | # Strip the intermediate commit (if there was one) and the amended | |||
|
1392 | # commit | |||
|
1393 | lock = repo.lock() | |||
|
1394 | try: | |||
|
1395 | if node: | |||
|
1396 | ui.note(_('stripping intermediate changeset %s\n') % ctx) | |||
|
1397 | ui.note(_('stripping amended changeset %s\n') % old) | |||
|
1398 | repair.strip(ui, repo, old.node(), topic='amend-backup') | |||
|
1399 | finally: | |||
|
1400 | lock.release() | |||
|
1401 | finally: | |||
|
1402 | wlock.release() | |||
|
1403 | return newid | |||
|
1404 | ||||
1288 | def commiteditor(repo, ctx, subs): |
|
1405 | def commiteditor(repo, ctx, subs): | |
1289 | if ctx.description(): |
|
1406 | if ctx.description(): | |
1290 | return ctx.description() |
|
1407 | return ctx.description() |
@@ -1163,6 +1163,7 b' def clone(ui, source, dest=None, **opts)' | |||||
1163 | _('mark new/missing files as added/removed before committing')), |
|
1163 | _('mark new/missing files as added/removed before committing')), | |
1164 | ('', 'close-branch', None, |
|
1164 | ('', 'close-branch', None, | |
1165 | _('mark a branch as closed, hiding it from the branch list')), |
|
1165 | _('mark a branch as closed, hiding it from the branch list')), | |
|
1166 | ('', 'amend', None, _('amend the parent of the working dir')), | |||
1166 | ] + walkopts + commitopts + commitopts2 + subrepoopts, |
|
1167 | ] + walkopts + commitopts + commitopts2 + subrepoopts, | |
1167 | _('[OPTION]... [FILE]...')) |
|
1168 | _('[OPTION]... [FILE]...')) | |
1168 | def commit(ui, repo, *pats, **opts): |
|
1169 | def commit(ui, repo, *pats, **opts): | |
@@ -1183,6 +1184,20 b' def commit(ui, repo, *pats, **opts):' | |||||
1183 | commit fails, you will find a backup of your message in |
|
1184 | commit fails, you will find a backup of your message in | |
1184 | ``.hg/last-message.txt``. |
|
1185 | ``.hg/last-message.txt``. | |
1185 |
|
1186 | |||
|
1187 | The --amend flag can be used to amend the parent of the | |||
|
1188 | working directory with a new commit that contains the changes | |||
|
1189 | in the parent in addition to those currently reported by :hg:`status`, | |||
|
1190 | if there are any. The old commit is stored in a backup bundle in | |||
|
1191 | ``.hg/strip-backup`` (see :hg:`help bundle` and :hg:`help unbundle` | |||
|
1192 | on how to restore it). | |||
|
1193 | ||||
|
1194 | Message, user and date are taken from the amended commit unless | |||
|
1195 | specified. When a message isn't specified on the command line, | |||
|
1196 | the editor will open with the message of the amended commit. | |||
|
1197 | ||||
|
1198 | It is not possible to amend public changesets (see :hg:`help phases`) | |||
|
1199 | or changesets that have children. | |||
|
1200 | ||||
1186 | See :hg:`help dates` for a list of formats valid for -d/--date. |
|
1201 | See :hg:`help dates` for a list of formats valid for -d/--date. | |
1187 |
|
1202 | |||
1188 | Returns 0 on success, 1 if nothing changed. |
|
1203 | Returns 0 on success, 1 if nothing changed. | |
@@ -1198,31 +1213,70 b' def commit(ui, repo, *pats, **opts):' | |||||
1198 | # current branch, so it's sufficient to test branchheads |
|
1213 | # current branch, so it's sufficient to test branchheads | |
1199 | raise util.Abort(_('can only close branch heads')) |
|
1214 | raise util.Abort(_('can only close branch heads')) | |
1200 | extra['close'] = 1 |
|
1215 | extra['close'] = 1 | |
1201 | e = cmdutil.commiteditor |
|
|||
1202 | if opts.get('force_editor'): |
|
|||
1203 | e = cmdutil.commitforceeditor |
|
|||
1204 |
|
||||
1205 | def commitfunc(ui, repo, message, match, opts): |
|
|||
1206 | return repo.commit(message, opts.get('user'), opts.get('date'), match, |
|
|||
1207 | editor=e, extra=extra) |
|
|||
1208 |
|
1216 | |||
1209 | branch = repo[None].branch() |
|
1217 | branch = repo[None].branch() | |
1210 | bheads = repo.branchheads(branch) |
|
1218 | bheads = repo.branchheads(branch) | |
1211 |
|
1219 | |||
1212 | node = cmdutil.commit(ui, repo, commitfunc, pats, opts) |
|
1220 | if opts.get('amend'): | |
1213 | if not node: |
|
1221 | if ui.config('ui', 'commitsubrepos'): | |
1214 | stat = repo.status(match=scmutil.match(repo[None], pats, opts)) |
|
1222 | raise util.Abort(_('cannot amend recursively')) | |
1215 | if stat[3]: |
|
1223 | ||
1216 | ui.status(_("nothing changed (%d missing files, see 'hg status')\n") |
|
1224 | old = repo['.'] | |
1217 | % len(stat[3])) |
|
1225 | if old.phase() == phases.public: | |
1218 | else: |
|
1226 | raise util.Abort(_('cannot amend public changesets')) | |
|
1227 | if len(old.parents()) > 1: | |||
|
1228 | raise util.Abort(_('cannot amend merge changesets')) | |||
|
1229 | if len(repo[None].parents()) > 1: | |||
|
1230 | raise util.Abort(_('cannot amend while merging')) | |||
|
1231 | if old.children(): | |||
|
1232 | raise util.Abort(_('cannot amend changeset with children')) | |||
|
1233 | ||||
|
1234 | e = cmdutil.commiteditor | |||
|
1235 | if opts.get('force_editor'): | |||
|
1236 | e = cmdutil.commitforceeditor | |||
|
1237 | ||||
|
1238 | def commitfunc(ui, repo, message, match, opts): | |||
|
1239 | editor = e | |||
|
1240 | # message contains text from -m or -l, if it's empty, | |||
|
1241 | # open the editor with the old message | |||
|
1242 | if not message: | |||
|
1243 | message = old.description() | |||
|
1244 | editor = cmdutil.commitforceeditor | |||
|
1245 | return repo.commit(message, | |||
|
1246 | opts.get('user') or old.user(), | |||
|
1247 | opts.get('date') or old.date(), | |||
|
1248 | match, | |||
|
1249 | editor=editor, | |||
|
1250 | extra=extra) | |||
|
1251 | ||||
|
1252 | node = cmdutil.amend(ui, repo, commitfunc, old, extra, pats, opts) | |||
|
1253 | if node == old.node(): | |||
1219 | ui.status(_("nothing changed\n")) |
|
1254 | ui.status(_("nothing changed\n")) | |
1220 | return 1 |
|
1255 | return 1 | |
|
1256 | else: | |||
|
1257 | e = cmdutil.commiteditor | |||
|
1258 | if opts.get('force_editor'): | |||
|
1259 | e = cmdutil.commitforceeditor | |||
|
1260 | ||||
|
1261 | def commitfunc(ui, repo, message, match, opts): | |||
|
1262 | return repo.commit(message, opts.get('user'), opts.get('date'), | |||
|
1263 | match, editor=e, extra=extra) | |||
|
1264 | ||||
|
1265 | node = cmdutil.commit(ui, repo, commitfunc, pats, opts) | |||
|
1266 | ||||
|
1267 | if not node: | |||
|
1268 | stat = repo.status(match=scmutil.match(repo[None], pats, opts)) | |||
|
1269 | if stat[3]: | |||
|
1270 | ui.status(_("nothing changed (%d missing files, see " | |||
|
1271 | "'hg status')\n") % len(stat[3])) | |||
|
1272 | else: | |||
|
1273 | ui.status(_("nothing changed\n")) | |||
|
1274 | return 1 | |||
1221 |
|
1275 | |||
1222 | ctx = repo[node] |
|
1276 | ctx = repo[node] | |
1223 | parents = ctx.parents() |
|
1277 | parents = ctx.parents() | |
1224 |
|
1278 | |||
1225 | if (bheads and node not in bheads and not |
|
1279 | if (not opts.get('amend') and bheads and node not in bheads and not | |
1226 | [x for x in parents if x.node() in bheads and x.branch() == branch]): |
|
1280 | [x for x in parents if x.node() in bheads and x.branch() == branch]): | |
1227 | ui.status(_('created new head\n')) |
|
1281 | ui.status(_('created new head\n')) | |
1228 | # The message is not printed for initial roots. For the other |
|
1282 | # The message is not printed for initial roots. For the other |
@@ -193,7 +193,7 b' Show all commands + options' | |||||
193 | add: include, exclude, subrepos, dry-run |
|
193 | add: include, exclude, subrepos, dry-run | |
194 | annotate: rev, follow, no-follow, text, user, file, date, number, changeset, line-number, ignore-all-space, ignore-space-change, ignore-blank-lines, include, exclude |
|
194 | annotate: rev, follow, no-follow, text, user, file, date, number, changeset, line-number, ignore-all-space, ignore-space-change, ignore-blank-lines, include, exclude | |
195 | clone: noupdate, updaterev, rev, branch, pull, uncompressed, ssh, remotecmd, insecure |
|
195 | clone: noupdate, updaterev, rev, branch, pull, uncompressed, ssh, remotecmd, insecure | |
196 | commit: addremove, close-branch, include, exclude, message, logfile, date, user, subrepos |
|
196 | commit: addremove, close-branch, amend, include, exclude, message, logfile, date, user, subrepos | |
197 | diff: rev, change, text, git, nodates, show-function, reverse, ignore-all-space, ignore-space-change, ignore-blank-lines, unified, stat, include, exclude, subrepos |
|
197 | diff: rev, change, text, git, nodates, show-function, reverse, ignore-all-space, ignore-space-change, ignore-blank-lines, unified, stat, include, exclude, subrepos | |
198 | export: output, switch-parent, rev, text, git, nodates |
|
198 | export: output, switch-parent, rev, text, git, nodates | |
199 | forget: include, exclude |
|
199 | forget: include, exclude |
@@ -59,6 +59,7 b' help record (record)' | |||||
59 | committing |
|
59 | committing | |
60 | --close-branch mark a branch as closed, hiding it from the branch |
|
60 | --close-branch mark a branch as closed, hiding it from the branch | |
61 | list |
|
61 | list | |
|
62 | --amend amend the parent of the working dir | |||
62 | -I --include PATTERN [+] include names matching the given patterns |
|
63 | -I --include PATTERN [+] include names matching the given patterns | |
63 | -X --exclude PATTERN [+] exclude names matching the given patterns |
|
64 | -X --exclude PATTERN [+] exclude names matching the given patterns | |
64 | -m --message TEXT use text as commit message |
|
65 | -m --message TEXT use text as commit message |
General Comments 0
You need to be logged in to leave comments.
Login now