comparison mercurial/commands.py @ 2741:ae5ce3454ef5

log: add -f/--follow option, to follow rename/copy
author Vadim Gelfer <vadim.gelfer@gmail.com>
date Mon, 31 Jul 2006 07:31:31 -0700
parents 3248aa10b388
children a31f0f2997e9
comparison
equal deleted inserted replaced
2740:386f04d6ecb3 2741:ae5ce3454ef5
123 if windowsize < sizelimit: 123 if windowsize < sizelimit:
124 windowsize *= 2 124 windowsize *= 2
125 125
126 126
127 files, matchfn, anypats = matchpats(repo, pats, opts) 127 files, matchfn, anypats = matchpats(repo, pats, opts)
128 follow = opts.get('follow')
128 129
129 if repo.changelog.count() == 0: 130 if repo.changelog.count() == 0:
130 return [], False, matchfn 131 return [], False, matchfn
131 132
132 revs = map(int, revrange(ui, repo, opts['rev'] or ['tip:0'])) 133 revs = map(int, revrange(ui, repo, opts['rev'] or ['tip:0']))
142 return ch 143 return ch
143 144
144 if not slowpath and not files: 145 if not slowpath and not files:
145 # No files, no patterns. Display all revs. 146 # No files, no patterns. Display all revs.
146 wanted = dict(zip(revs, revs)) 147 wanted = dict(zip(revs, revs))
148 copies = []
147 if not slowpath: 149 if not slowpath:
148 # Only files, no patterns. Check the history of each file. 150 # Only files, no patterns. Check the history of each file.
149 def filerevgen(filelog): 151 def filerevgen(filelog, node):
150 cl_count = repo.changelog.count() 152 cl_count = repo.changelog.count()
151 for i, window in increasing_windows(filelog.count()-1, -1): 153 if node is None:
154 last = filelog.count() - 1
155 else:
156 last = filelog.rev(node)
157 for i, window in increasing_windows(last, -1):
152 revs = [] 158 revs = []
153 for j in xrange(i - window, i + 1): 159 for j in xrange(i - window, i + 1):
154 revs.append(filelog.linkrev(filelog.node(j))) 160 n = filelog.node(j)
161 revs.append((filelog.linkrev(n),
162 follow and filelog.renamed(n)))
155 revs.reverse() 163 revs.reverse()
156 for rev in revs: 164 for rev in revs:
157 # only yield rev for which we have the changelog, it can 165 # only yield rev for which we have the changelog, it can
158 # happen while doing "hg log" during a pull or commit 166 # happen while doing "hg log" during a pull or commit
159 if rev < cl_count: 167 if rev[0] < cl_count:
160 yield rev 168 yield rev
161 169 def iterfiles():
170 for filename in files:
171 yield filename, None
172 for filename_node in copies:
173 yield filename_node
162 minrev, maxrev = min(revs), max(revs) 174 minrev, maxrev = min(revs), max(revs)
163 for file_ in files: 175 for file_, node in iterfiles():
164 filelog = repo.file(file_) 176 filelog = repo.file(file_)
165 # A zero count may be a directory or deleted file, so 177 # A zero count may be a directory or deleted file, so
166 # try to find matching entries on the slow path. 178 # try to find matching entries on the slow path.
167 if filelog.count() == 0: 179 if filelog.count() == 0:
168 slowpath = True 180 slowpath = True
169 break 181 break
170 for rev in filerevgen(filelog): 182 for rev, copied in filerevgen(filelog, node):
171 if rev <= maxrev: 183 if rev <= maxrev:
172 if rev < minrev: 184 if rev < minrev:
173 break 185 break
174 fncache.setdefault(rev, []) 186 fncache.setdefault(rev, [])
175 fncache[rev].append(file_) 187 fncache[rev].append(file_)
176 wanted[rev] = 1 188 wanted[rev] = 1
189 if follow and copied:
190 copies.append(copied)
177 if slowpath: 191 if slowpath:
192 if follow:
193 raise util.Abort(_('can only follow copies/renames for explicit '
194 'file names'))
195
178 # The slow path checks files modified in every changeset. 196 # The slow path checks files modified in every changeset.
179 def changerevgen(): 197 def changerevgen():
180 for i, window in increasing_windows(repo.changelog.count()-1, -1): 198 for i, window in increasing_windows(repo.changelog.count()-1, -1):
181 for j in xrange(i - window, i + 1): 199 for j in xrange(i - window, i + 1):
182 yield j, getchange(j)[3] 200 yield j, getchange(j)[3]
1928 ui.write(((pats and rel) or abs), end) 1946 ui.write(((pats and rel) or abs), end)
1929 1947
1930 def log(ui, repo, *pats, **opts): 1948 def log(ui, repo, *pats, **opts):
1931 """show revision history of entire repository or files 1949 """show revision history of entire repository or files
1932 1950
1933 Print the revision history of the specified files or the entire project. 1951 Print the revision history of the specified files or the entire
1952 project.
1953
1954 File history is shown without following rename or copy history of
1955 files. Use -f/--follow to follow history across renames and
1956 copies.
1934 1957
1935 By default this command outputs: changeset id and hash, tags, 1958 By default this command outputs: changeset id and hash, tags,
1936 non-trivial parents, user, date and time, and a summary for each 1959 non-trivial parents, user, date and time, and a summary for each
1937 commit. When the -v/--verbose switch is used, the list of changed 1960 commit. When the -v/--verbose switch is used, the list of changed
1938 files and full commit message is shown. 1961 files and full commit message is shown.
3041 ('X', 'exclude', [], _('exclude names matching the given patterns'))], 3064 ('X', 'exclude', [], _('exclude names matching the given patterns'))],
3042 _('hg locate [OPTION]... [PATTERN]...')), 3065 _('hg locate [OPTION]... [PATTERN]...')),
3043 "^log|history": 3066 "^log|history":
3044 (log, 3067 (log,
3045 [('b', 'branches', None, _('show branches')), 3068 [('b', 'branches', None, _('show branches')),
3069 ('f', 'follow', None,
3070 _('follow file history across copies and renames')),
3046 ('k', 'keyword', [], _('search for a keyword')), 3071 ('k', 'keyword', [], _('search for a keyword')),
3047 ('l', 'limit', '', _('limit number of changes displayed')), 3072 ('l', 'limit', '', _('limit number of changes displayed')),
3048 ('r', 'rev', [], _('show the specified revision or range')), 3073 ('r', 'rev', [], _('show the specified revision or range')),
3049 ('M', 'no-merges', None, _('do not show merges')), 3074 ('M', 'no-merges', None, _('do not show merges')),
3050 ('', 'style', '', _('display using template map file')), 3075 ('', 'style', '', _('display using template map file')),