45 |
45 |
46 def walk(repo, pats, opts, head = ''): |
46 def walk(repo, pats, opts, head = ''): |
47 cwd = repo.getcwd() |
47 cwd = repo.getcwd() |
48 c = 0 |
48 c = 0 |
49 if cwd: c = len(cwd) + 1 |
49 if cwd: c = len(cwd) + 1 |
50 for src, fn in repo.walk(match = matchpats(cwd, pats, opts, head)): |
50 files, matchfn = matchpats(cwd, pats, opts, head) |
|
51 for src, fn in repo.walk(files = files, match = matchfn): |
51 yield src, fn, fn[c:] |
52 yield src, fn, fn[c:] |
52 |
53 |
53 revrangesep = ':' |
54 revrangesep = ':' |
54 |
55 |
55 def revrange(ui, repo, revs, revlog=None): |
56 def revrange(ui, repo, revs, revlog=None): |
337 repo.add(names) |
338 repo.add(names) |
338 |
339 |
339 def addremove(ui, repo, *pats, **opts): |
340 def addremove(ui, repo, *pats, **opts): |
340 """add all new files, delete all missing files""" |
341 """add all new files, delete all missing files""" |
341 q = dict(zip(pats, pats)) |
342 q = dict(zip(pats, pats)) |
342 cwd = repo.getcwd() |
343 add, remove = [], [] |
343 n = (cwd and len(cwd) + 1) or 0 |
344 for src, abs, rel in walk(repo, pats, opts): |
344 c, a, d, u = repo.changes(match = matchpats(cwd, pats, opts)) |
345 if src == 'f': |
345 for f in u: |
346 if repo.dirstate.state(abs) == '?': |
346 if f not in q: |
347 add.append(abs) |
347 ui.status('adding %s\n' % f[n:]) |
348 if rel not in q: ui.status('adding ', rel, '\n') |
348 repo.add(u) |
349 elif repo.dirstate.state(abs) != 'r' and not os.path.exists(rel): |
349 for f in d: |
350 remove.append(abs) |
350 if f not in q: |
351 if rel not in q: ui.status('removing ', rel, '\n') |
351 ui.status('removing %s\n' % f[n:]) |
352 repo.add(add) |
352 repo.remove(d) |
353 repo.remove(remove) |
353 |
354 |
354 def annotate(ui, repo, *pats, **opts): |
355 def annotate(ui, repo, *pats, **opts): |
355 """show changeset information per file line""" |
356 """show changeset information per file line""" |
356 def getnode(rev): |
357 def getnode(rev): |
357 return hg.short(repo.changelog.node(rev)) |
358 return hg.short(repo.changelog.node(rev)) |
465 if not opts['noupdate']: |
466 if not opts['noupdate']: |
466 update(ui, repo) |
467 update(ui, repo) |
467 |
468 |
468 d.close() |
469 d.close() |
469 |
470 |
470 def commit(ui, repo, *files, **opts): |
471 def commit(ui, repo, *pats, **opts): |
471 """commit the specified files or all outstanding changes""" |
472 """commit the specified files or all outstanding changes""" |
472 if opts['text']: |
473 if opts['text']: |
473 ui.warn("Warning: -t and --text is deprecated," |
474 ui.warn("Warning: -t and --text is deprecated," |
474 " please use -m or --message instead.\n") |
475 " please use -m or --message instead.\n") |
475 message = opts['message'] or opts['text'] |
476 message = opts['message'] or opts['text'] |
479 message = open(logfile).read() |
480 message = open(logfile).read() |
480 except IOError, why: |
481 except IOError, why: |
481 ui.warn("Can't read commit message %s: %s\n" % (logfile, why)) |
482 ui.warn("Can't read commit message %s: %s\n" % (logfile, why)) |
482 |
483 |
483 if opts['addremove']: |
484 if opts['addremove']: |
484 addremove(ui, repo, *files) |
485 addremove(ui, repo, *pats, **opts) |
485 repo.commit(relpath(repo, files), message, opts['user'], opts['date']) |
486 cwd = repo.getcwd() |
|
487 if not pats and cwd: |
|
488 opts['include'] = [os.path.join(cwd, i) for i in opts['include']] |
|
489 opts['exclude'] = [os.path.join(cwd, x) for x in opts['exclude']] |
|
490 fns, match = matchpats((pats and repo.getcwd()) or '', pats, opts) |
|
491 if pats: |
|
492 c, a, d, u = repo.changes(files = fns, match = match) |
|
493 files = c + a + [fn for fn in d if repo.dirstate.state(fn) == 'r'] |
|
494 else: |
|
495 files = [] |
|
496 repo.commit(files, message, opts['user'], opts['date'], match) |
486 |
497 |
487 def copy(ui, repo, source, dest): |
498 def copy(ui, repo, source, dest): |
488 """mark a file as copied or renamed for the next commit""" |
499 """mark a file as copied or renamed for the next commit""" |
489 return repo.copy(*relpath(repo, (source, dest))) |
500 return repo.copy(*relpath(repo, (source, dest))) |
490 |
501 |
602 ui.note(len(revs) > 1 and "Exporting patches:\n" or "Exporting patch:\n") |
613 ui.note(len(revs) > 1 and "Exporting patches:\n" or "Exporting patch:\n") |
603 for cset in revs: |
614 for cset in revs: |
604 seqno += 1 |
615 seqno += 1 |
605 doexport(ui, repo, cset, seqno, total, revwidth, opts) |
616 doexport(ui, repo, cset, seqno, total, revwidth, opts) |
606 |
617 |
607 def forget(ui, repo, file1, *files): |
618 def forget(ui, repo, *pats, **opts): |
608 """don't add the specified files on the next commit""" |
619 """don't add the specified files on the next commit""" |
609 repo.forget(relpath(repo, (file1,) + files)) |
620 q = dict(zip(pats, pats)) |
|
621 forget = [] |
|
622 for src, abs, rel in walk(repo, pats, opts): |
|
623 if repo.dirstate.state(abs) == 'a': |
|
624 forget.append(abs) |
|
625 if rel not in q: ui.status('forgetting ', rel, '\n') |
|
626 repo.forget(forget) |
610 |
627 |
611 def heads(ui, repo): |
628 def heads(ui, repo): |
612 """show current repository heads""" |
629 """show current repository heads""" |
613 for n in repo.changelog.heads(): |
630 for n in repo.changelog.heads(): |
614 show_changeset(ui, repo, changenode=n) |
631 show_changeset(ui, repo, changenode=n) |
1002 M = modified |
1019 M = modified |
1003 A = added |
1020 A = added |
1004 R = removed |
1021 R = removed |
1005 ? = not tracked''' |
1022 ? = not tracked''' |
1006 |
1023 |
1007 (c, a, d, u) = repo.changes(match = matchpats(repo.getcwd(), pats, opts)) |
1024 files, matchfn = matchpats(repo.getcwd(), pats, opts) |
|
1025 (c, a, d, u) = repo.changes(files = files, match = matchfn) |
1008 (c, a, d, u) = map(lambda x: relfilter(repo, x), (c, a, d, u)) |
1026 (c, a, d, u) = map(lambda x: relfilter(repo, x), (c, a, d, u)) |
1009 |
1027 |
1010 for f in c: |
1028 for f in c: |
1011 ui.write("M ", f, "\n") |
1029 ui.write("M ", f, "\n") |
1012 for f in a: |
1030 for f in a: |
1133 [('U', 'noupdate', None, 'skip update after cloning')], |
1151 [('U', 'noupdate', None, 'skip update after cloning')], |
1134 'hg clone [-U] SOURCE [DEST]'), |
1152 'hg clone [-U] SOURCE [DEST]'), |
1135 "^commit|ci": |
1153 "^commit|ci": |
1136 (commit, |
1154 (commit, |
1137 [('A', 'addremove', None, 'run add/remove during commit'), |
1155 [('A', 'addremove', None, 'run add/remove during commit'), |
|
1156 ('I', 'include', [], 'include path in search'), |
|
1157 ('X', 'exclude', [], 'exclude path from search'), |
1138 ('m', 'message', "", 'commit message'), |
1158 ('m', 'message', "", 'commit message'), |
1139 ('t', 'text', "", 'commit message (deprecated: use -m)'), |
1159 ('t', 'text', "", 'commit message (deprecated: use -m)'), |
1140 ('l', 'logfile', "", 'commit message file'), |
1160 ('l', 'logfile', "", 'commit message file'), |
1141 ('d', 'date', "", 'date code'), |
1161 ('d', 'date', "", 'date code'), |
1142 ('u', 'user', "", 'user')], |
1162 ('u', 'user', "", 'user')], |
1154 'hg diff [-r REV1 [-r REV2]] [FILE]...'), |
1174 'hg diff [-r REV1 [-r REV2]] [FILE]...'), |
1155 "^export": |
1175 "^export": |
1156 (export, |
1176 (export, |
1157 [('o', 'output', "", 'output to file')], |
1177 [('o', 'output', "", 'output to file')], |
1158 "hg export [-o OUTFILE] REV..."), |
1178 "hg export [-o OUTFILE] REV..."), |
1159 "forget": (forget, [], "hg forget FILE..."), |
1179 "forget": (forget, |
|
1180 [('I', 'include', [], 'include path in search'), |
|
1181 ('X', 'exclude', [], 'exclude path from search')], |
|
1182 "hg forget FILE..."), |
1160 "heads": (heads, [], 'hg heads'), |
1183 "heads": (heads, [], 'hg heads'), |
1161 "help": (help_, [], 'hg help [COMMAND]'), |
1184 "help": (help_, [], 'hg help [COMMAND]'), |
1162 "identify|id": (identify, [], 'hg identify'), |
1185 "identify|id": (identify, [], 'hg identify'), |
1163 "import|patch": |
1186 "import|patch": |
1164 (import_, |
1187 (import_, |