Mercurial > hg
changeset 2661:5c10b7ed3411
status: add -c (clean) and -A (all files) options
also add new localrepo.status what is more uniform than localrepo.changes.
localrepo.changes is deprecated and will go away soon.
author | Vadim Gelfer <vadim.gelfer@gmail.com> |
---|---|
date | Thu, 20 Jul 2006 16:21:07 -0700 |
parents | 02b6fa7bbfbf |
children | 2c5d5cf35034 |
files | mercurial/commands.py mercurial/dirstate.py mercurial/localrepo.py tests/test-help.out tests/test-status tests/test-status.out |
diffstat | 6 files changed, 111 insertions(+), 31 deletions(-) [+] |
line wrap: on
line diff
--- a/mercurial/commands.py Wed Jul 19 07:56:40 2006 -0700 +++ b/mercurial/commands.py Thu Jul 20 16:21:07 2006 -0700 @@ -2599,37 +2599,44 @@ def status(ui, repo, *pats, **opts): """show changed files in the working directory - Show changed files in the repository. If names are - given, only files that match are shown. + Show status of files in the repository. If names are given, only + files that match are shown. Files that are clean or ignored, are + not listed unless -c (clean), -i (ignored) or -A is given. The codes used to show the status of files are: M = modified A = added R = removed + C = clean ! = deleted, but still tracked ? = not tracked I = ignored (not shown by default) = the previous added file was copied from here """ - show_ignored = opts['ignored'] and True or False + all = opts['all'] + files, matchfn, anypats = matchpats(repo, pats, opts) cwd = (pats and repo.getcwd()) or '' - modified, added, removed, deleted, unknown, ignored = [ + modified, added, removed, deleted, unknown, ignored, clean = [ [util.pathto(cwd, x) for x in n] - for n in repo.changes(files=files, match=matchfn, - show_ignored=show_ignored)] - - changetypes = [('modified', 'M', modified), + for n in repo.status(files=files, match=matchfn, + list_ignored=all or opts['ignored'], + list_clean=all or opts['clean'])] + + changetypes = (('modified', 'M', modified), ('added', 'A', added), ('removed', 'R', removed), ('deleted', '!', deleted), ('unknown', '?', unknown), - ('ignored', 'I', ignored)] + ('ignored', 'I', ignored)) + + explicit_changetypes = changetypes + (('clean', 'C', clean),) end = opts['print0'] and '\0' or '\n' - for opt, char, changes in ([ct for ct in changetypes if opts[ct[0]]] + for opt, char, changes in ([ct for ct in explicit_changetypes + if all or opts[ct[0]]] or changetypes): if opts['no_status']: format = "%%s%s" % end @@ -2638,7 +2645,7 @@ for f in changes: ui.write(format % f) - if (opts.get('copies') and not opts.get('no_status') + if ((all or opts.get('copies')) and not opts.get('no_status') and opt == 'added' and repo.dirstate.copies.has_key(f)): ui.write(' %s%s' % (repo.dirstate.copies[f], end)) @@ -3123,10 +3130,12 @@ _('hg serve [OPTION]...')), "^status|st": (status, - [('m', 'modified', None, _('show only modified files')), + [('A', 'all', None, _('show status of all files')), + ('m', 'modified', None, _('show only modified files')), ('a', 'added', None, _('show only added files')), ('r', 'removed', None, _('show only removed files')), ('d', 'deleted', None, _('show only deleted (but tracked) files')), + ('c', 'clean', None, _('show only files without changes')), ('u', 'unknown', None, _('show only unknown (not tracked) files')), ('i', 'ignored', None, _('show ignored files')), ('n', 'no-status', None, _('hide status prefix')),
--- a/mercurial/dirstate.py Wed Jul 19 07:56:40 2006 -0700 +++ b/mercurial/dirstate.py Thu Jul 20 16:21:07 2006 -0700 @@ -434,15 +434,16 @@ if not seen(k) and (statmatch(k, None)): yield 'm', k, None - def changes(self, files=None, match=util.always, show_ignored=None): + def status(self, files=None, match=util.always, list_ignored=False, + list_clean=False): lookup, modified, added, unknown, ignored = [], [], [], [], [] - removed, deleted = [], [] + removed, deleted, clean = [], [], [] - for src, fn, st in self.statwalk(files, match, ignored=show_ignored): + for src, fn, st in self.statwalk(files, match, ignored=list_ignored): try: type_, mode, size, time = self[fn] except KeyError: - if show_ignored and self.ignore(fn): + if list_ignored and self.ignore(fn): ignored.append(fn) else: unknown.append(fn) @@ -473,6 +474,8 @@ modified.append(fn) elif time != st.st_mtime: lookup.append(fn) + elif list_clean: + clean.append(fn) elif type_ == 'm': modified.append(fn) elif type_ == 'a': @@ -480,4 +483,5 @@ elif type_ == 'r': removed.append(fn) - return (lookup, modified, added, removed, deleted, unknown, ignored) + return (lookup, modified, added, removed, deleted, unknown, ignored, + clean)
--- a/mercurial/localrepo.py Wed Jul 19 07:56:40 2006 -0700 +++ b/mercurial/localrepo.py Thu Jul 20 16:21:07 2006 -0700 @@ -658,9 +658,9 @@ for src, fn in self.dirstate.walk(files, match, badmatch=badmatch): yield src, fn - def changes(self, node1=None, node2=None, files=[], match=util.always, - wlock=None, show_ignored=None): - """return changes between two nodes or node and working directory + def status(self, node1=None, node2=None, files=[], match=util.always, + wlock=None, list_ignored=False, list_clean=False): + """return status of files between two nodes or node and working directory If node1 is None, use the first dirstate parent instead. If node2 is None, compare node1 with working directory. @@ -679,7 +679,9 @@ del mf[fn] return mf - modified, added, removed, deleted, unknown, ignored = [],[],[],[],[],[] + modified, added, removed, deleted, unknown = [], [], [], [], [] + ignored, clean = [], [] + compareworking = False if not node1 or (not node2 and node1 == self.dirstate.parents()[0]): compareworking = True @@ -697,8 +699,9 @@ wlock = self.wlock(wait=0) except lock.LockException: wlock = None - lookup, modified, added, removed, deleted, unknown, ignored = ( - self.dirstate.changes(files, match, show_ignored)) + (lookup, modified, added, removed, deleted, unknown, + ignored, clean) = self.dirstate.status(files, match, + list_ignored, list_clean) # are we comparing working dir against its parent? if compareworking: @@ -721,12 +724,11 @@ del mf2[f] else: # we are comparing two revisions - deleted, unknown, ignored = [], [], [] mf2 = mfmatches(node2) if not compareworking: # flush lists from dirstate before comparing manifests - modified, added = [], [] + modified, added, clean = [], [], [] # make sure to sort the files so we talk to the disk in a # reasonable order @@ -736,6 +738,8 @@ if mf1.has_key(fn): if mf1[fn] != mf2[fn] and (mf2[fn] != "" or fcmp(fn, mf1)): modified.append(fn) + elif list_clean: + clean.append(fn) del mf1[fn] else: added.append(fn) @@ -743,12 +747,19 @@ removed = mf1.keys() # sort and return results: - for l in modified, added, removed, deleted, unknown, ignored: + for l in modified, added, removed, deleted, unknown, ignored, clean: l.sort() - if show_ignored is None: - return (modified, added, removed, deleted, unknown) + return (modified, added, removed, deleted, unknown, ignored, clean) + + def changes(self, node1=None, node2=None, files=[], match=util.always, + wlock=None, list_ignored=False, list_clean=False): + '''DEPRECATED - use status instead''' + marduit = self.status(node1, node2, files, match, wlock, + list_ignored, list_clean) + if list_ignored: + return marduit[:-1] else: - return (modified, added, removed, deleted, unknown, ignored) + return marduit[:-2] def add(self, list, wlock=None): if not wlock:
--- a/tests/test-help.out Wed Jul 19 07:56:40 2006 -0700 +++ b/tests/test-help.out Thu Jul 20 16:21:07 2006 -0700 @@ -185,13 +185,15 @@ show changed files in the working directory - Show changed files in the repository. If names are - given, only files that match are shown. + Show status of files in the repository. If names are given, only + files that match are shown. Files that are clean or ignored, are + not listed unless -c (clean), -i (ignored) or -A is given. The codes used to show the status of files are: M = modified A = added R = removed + C = clean ! = deleted, but still tracked ? = not tracked I = ignored (not shown by default) @@ -201,10 +203,12 @@ options: + -A --all show status of all files -m --modified show only modified files -a --added show only added files -r --removed show only removed files -d --deleted show only deleted (but tracked) files + -c --clean show only files without changes -u --unknown show only unknown (not tracked) files -i --ignored show ignored files -n --no-status hide status prefix
--- a/tests/test-status Wed Jul 19 07:56:40 2006 -0700 +++ b/tests/test-status Thu Jul 20 16:21:07 2006 -0700 @@ -35,3 +35,8 @@ hg copy modified copied echo "hg status -C:" hg status -C + +echo "hg status -t:" +hg status -t +echo "hg status -A:" +hg status -A
--- a/tests/test-status.out Wed Jul 19 07:56:40 2006 -0700 +++ b/tests/test-status.out Thu Jul 20 16:21:07 2006 -0700 @@ -108,3 +108,50 @@ R removed ! deleted ? unknown +hg status -t: +hg status: option -t not recognized +hg status [OPTION]... [FILE]... + +show changed files in the working directory + + Show status of files in the repository. If names are given, only + files that match are shown. Files that are clean or ignored, are + not listed unless -c (clean), -i (ignored) or -A is given. + + The codes used to show the status of files are: + M = modified + A = added + R = removed + C = clean + ! = deleted, but still tracked + ? = not tracked + I = ignored (not shown by default) + = the previous added file was copied from here + +aliases: st + +options: + + -A --all show status of all files + -m --modified show only modified files + -a --added show only added files + -r --removed show only removed files + -d --deleted show only deleted (but tracked) files + -c --clean show only files without changes + -u --unknown show only unknown (not tracked) files + -i --ignored show ignored files + -n --no-status hide status prefix + -C --copies show source of copied files + -0 --print0 end filenames with NUL, for use with xargs + -I --include include names matching the given patterns + -X --exclude exclude names matching the given patterns +hg status -A: +A added +A copied + modified +R removed +! deleted +? unknown +I ignored +C .hgignore +C modified