6 # of the GNU General Public License, incorporated herein by reference. |
6 # of the GNU General Public License, incorporated herein by reference. |
7 |
7 |
8 from node import * |
8 from node import * |
9 from i18n import _ |
9 from i18n import _ |
10 import os, sys, atexit, signal, pdb, traceback, socket, errno, shlex |
10 import os, sys, atexit, signal, pdb, traceback, socket, errno, shlex |
|
11 import bisect, stat |
11 import mdiff, bdiff, util, templater, patch, commands, hg, lock, time |
12 import mdiff, bdiff, util, templater, patch, commands, hg, lock, time |
12 import fancyopts, revlog, version, extensions, hook |
13 import fancyopts, revlog, version, extensions, hook |
13 |
14 |
14 revrangesep = ':' |
15 revrangesep = ':' |
15 |
16 |
1273 fns = fns_generator() |
1274 fns = fns_generator() |
1274 yield 'add', rev, fns |
1275 yield 'add', rev, fns |
1275 for rev in nrevs: |
1276 for rev in nrevs: |
1276 yield 'iter', rev, None |
1277 yield 'iter', rev, None |
1277 return iterate(), matchfn |
1278 return iterate(), matchfn |
|
1279 |
|
1280 def commit(ui, repo, commitfunc, pats, opts): |
|
1281 '''commit the specified files or all outstanding changes''' |
|
1282 message = logmessage(opts) |
|
1283 |
|
1284 if opts['addremove']: |
|
1285 addremove(repo, pats, opts) |
|
1286 fns, match, anypats = matchpats(repo, pats, opts) |
|
1287 if pats: |
|
1288 status = repo.status(files=fns, match=match) |
|
1289 modified, added, removed, deleted, unknown = status[:5] |
|
1290 files = modified + added + removed |
|
1291 slist = None |
|
1292 for f in fns: |
|
1293 if f == '.': |
|
1294 continue |
|
1295 if f not in files: |
|
1296 rf = repo.wjoin(f) |
|
1297 try: |
|
1298 mode = os.lstat(rf)[stat.ST_MODE] |
|
1299 except OSError: |
|
1300 raise util.Abort(_("file %s not found!") % rf) |
|
1301 if stat.S_ISDIR(mode): |
|
1302 name = f + '/' |
|
1303 if slist is None: |
|
1304 slist = list(files) |
|
1305 slist.sort() |
|
1306 i = bisect.bisect(slist, name) |
|
1307 if i >= len(slist) or not slist[i].startswith(name): |
|
1308 raise util.Abort(_("no match under directory %s!") |
|
1309 % rf) |
|
1310 elif not (stat.S_ISREG(mode) or stat.S_ISLNK(mode)): |
|
1311 raise util.Abort(_("can't commit %s: " |
|
1312 "unsupported file type!") % rf) |
|
1313 elif f not in repo.dirstate: |
|
1314 raise util.Abort(_("file %s not tracked!") % rf) |
|
1315 else: |
|
1316 files = [] |
|
1317 try: |
|
1318 return commitfunc(ui, repo, files, message, match, opts) |
|
1319 except ValueError, inst: |
|
1320 raise util.Abort(str(inst)) |