##// END OF EJS Templates
log: move log file walk to its own function...
Durham Goode -
r19290:f21f4a1b default
parent child Browse files
Show More
@@ -1005,50 +1005,19 b' def increasingwindows(start, end, window'
1005 if windowsize < sizelimit:
1005 if windowsize < sizelimit:
1006 windowsize *= 2
1006 windowsize *= 2
1007
1007
1008 def walkchangerevs(repo, match, opts, prepare):
1008 class FileWalkError(Exception):
1009 '''Iterate over files and the revs in which they changed.
1009 pass
1010
1011 Callers most commonly need to iterate backwards over the history
1012 in which they are interested. Doing so has awful (quadratic-looking)
1013 performance, so we use iterators in a "windowed" way.
1014
1010
1015 We walk a window of revisions in the desired order. Within the
1011 def walkfilerevs(repo, match, follow, revs, fncache):
1016 window, we first walk forwards to gather data, then in the desired
1012 '''Walks the file history for the matched files.
1017 order (usually backwards) to display it.
1018
1019 This function returns an iterator yielding contexts. Before
1020 yielding each context, the iterator will first call the prepare
1021 function on each context in the window in forward order.'''
1022
1023 follow = opts.get('follow') or opts.get('follow_first')
1024
1013
1025 if opts.get('rev'):
1014 Returns the changeset revs that are involved in the file history.
1026 revs = scmutil.revrange(repo, opts.get('rev'))
1027 elif follow:
1028 revs = repo.revs('reverse(:.)')
1029 else:
1030 revs = list(repo)
1031 revs.reverse()
1032 if not revs:
1033 return []
1034 wanted = set()
1035 slowpath = match.anypats() or (match.files() and opts.get('removed'))
1036 fncache = {}
1037 change = repo.changectx
1038
1015
1039 # First step is to fill wanted, the set of revisions that we want to yield.
1016 Throws FileWalkError if the file history can't be walked using
1040 # When it does not induce extra cost, we also fill fncache for revisions in
1017 filelogs alone.
1041 # wanted: a cache of filenames that were changed (ctx.files()) and that
1018 '''
1042 # match the file filtering conditions.
1019 wanted = set()
1043
1044 if not slowpath and not match.files():
1045 # No files, no patterns. Display all revs.
1046 wanted = set(revs)
1047 copies = []
1020 copies = []
1048
1049 if not slowpath and match.files():
1050 # We only have to read through the filelog to find wanted revisions
1051
1052 minrev, maxrev = min(revs), max(revs)
1021 minrev, maxrev = min(revs), max(revs)
1053 def filerevgen(filelog, last):
1022 def filerevgen(filelog, last):
1054 """
1023 """
@@ -1090,6 +1059,7 b' def walkchangerevs(repo, match, opts, pr'
1090 yield filename, None
1059 yield filename, None
1091 for filename_node in copies:
1060 for filename_node in copies:
1092 yield filename_node
1061 yield filename_node
1062
1093 for file_, node in iterfiles():
1063 for file_, node in iterfiles():
1094 filelog = repo.file(file_)
1064 filelog = repo.file(file_)
1095 if not len(filelog):
1065 if not len(filelog):
@@ -1099,8 +1069,7 b' def walkchangerevs(repo, match, opts, pr'
1099 if follow:
1069 if follow:
1100 raise util.Abort(
1070 raise util.Abort(
1101 _('cannot follow nonexistent file: "%s"') % file_)
1071 _('cannot follow nonexistent file: "%s"') % file_)
1102 slowpath = True
1072 raise FileWalkError("Cannot walk via filelog")
1103 break
1104 else:
1073 else:
1105 continue
1074 continue
1106
1075
@@ -1135,10 +1104,59 b' def walkchangerevs(repo, match, opts, pr'
1135 if copied:
1104 if copied:
1136 copies.append(copied)
1105 copies.append(copied)
1137
1106
1107 return wanted
1108
1109 def walkchangerevs(repo, match, opts, prepare):
1110 '''Iterate over files and the revs in which they changed.
1111
1112 Callers most commonly need to iterate backwards over the history
1113 in which they are interested. Doing so has awful (quadratic-looking)
1114 performance, so we use iterators in a "windowed" way.
1115
1116 We walk a window of revisions in the desired order. Within the
1117 window, we first walk forwards to gather data, then in the desired
1118 order (usually backwards) to display it.
1119
1120 This function returns an iterator yielding contexts. Before
1121 yielding each context, the iterator will first call the prepare
1122 function on each context in the window in forward order.'''
1123
1124 follow = opts.get('follow') or opts.get('follow_first')
1125
1126 if opts.get('rev'):
1127 revs = scmutil.revrange(repo, opts.get('rev'))
1128 elif follow:
1129 revs = repo.revs('reverse(:.)')
1130 else:
1131 revs = list(repo)
1132 revs.reverse()
1133 if not revs:
1134 return []
1135 wanted = set()
1136 slowpath = match.anypats() or (match.files() and opts.get('removed'))
1137 fncache = {}
1138 change = repo.changectx
1139
1140 # First step is to fill wanted, the set of revisions that we want to yield.
1141 # When it does not induce extra cost, we also fill fncache for revisions in
1142 # wanted: a cache of filenames that were changed (ctx.files()) and that
1143 # match the file filtering conditions.
1144
1145 if not slowpath and not match.files():
1146 # No files, no patterns. Display all revs.
1147 wanted = set(revs)
1148
1149 if not slowpath and match.files():
1150 # We only have to read through the filelog to find wanted revisions
1151
1152 try:
1153 wanted = walkfilerevs(repo, match, follow, revs, fncache)
1154 except FileWalkError:
1155 slowpath = True
1156
1138 # We decided to fall back to the slowpath because at least one
1157 # We decided to fall back to the slowpath because at least one
1139 # of the paths was not a file. Check to see if at least one of them
1158 # of the paths was not a file. Check to see if at least one of them
1140 # existed in history, otherwise simply return
1159 # existed in history, otherwise simply return
1141 if slowpath:
1142 for path in match.files():
1160 for path in match.files():
1143 if path == '.' or path in repo.store:
1161 if path == '.' or path in repo.store:
1144 break
1162 break
General Comments 0
You need to be logged in to leave comments. Login now