2230 return changed |
2231 return changed |
2231 |
2232 |
2232 class GitDiffRequired(Exception): |
2233 class GitDiffRequired(Exception): |
2233 pass |
2234 pass |
2234 |
2235 |
2235 def diffallopts(ui, opts=None, untrusted=False, section='diff'): |
2236 diffopts = diffutil.diffopts |
2236 '''return diffopts with all features supported and parsed''' |
2237 diffallopts = diffutil.diffallopts |
2237 return difffeatureopts(ui, opts=opts, untrusted=untrusted, section=section, |
2238 difffeatureopts = diffutil.difffeatureopts |
2238 git=True, whitespace=True, formatchanging=True) |
|
2239 |
|
2240 diffopts = diffallopts |
|
2241 |
|
2242 def difffeatureopts(ui, opts=None, untrusted=False, section='diff', git=False, |
|
2243 whitespace=False, formatchanging=False): |
|
2244 '''return diffopts with only opted-in features parsed |
|
2245 |
|
2246 Features: |
|
2247 - git: git-style diffs |
|
2248 - whitespace: whitespace options like ignoreblanklines and ignorews |
|
2249 - formatchanging: options that will likely break or cause correctness issues |
|
2250 with most diff parsers |
|
2251 ''' |
|
2252 def get(key, name=None, getter=ui.configbool, forceplain=None): |
|
2253 if opts: |
|
2254 v = opts.get(key) |
|
2255 # diffopts flags are either None-default (which is passed |
|
2256 # through unchanged, so we can identify unset values), or |
|
2257 # some other falsey default (eg --unified, which defaults |
|
2258 # to an empty string). We only want to override the config |
|
2259 # entries from hgrc with command line values if they |
|
2260 # appear to have been set, which is any truthy value, |
|
2261 # True, or False. |
|
2262 if v or isinstance(v, bool): |
|
2263 return v |
|
2264 if forceplain is not None and ui.plain(): |
|
2265 return forceplain |
|
2266 return getter(section, name or key, untrusted=untrusted) |
|
2267 |
|
2268 # core options, expected to be understood by every diff parser |
|
2269 buildopts = { |
|
2270 'nodates': get('nodates'), |
|
2271 'showfunc': get('show_function', 'showfunc'), |
|
2272 'context': get('unified', getter=ui.config), |
|
2273 } |
|
2274 buildopts['worddiff'] = ui.configbool('experimental', 'worddiff') |
|
2275 buildopts['xdiff'] = ui.configbool('experimental', 'xdiff') |
|
2276 |
|
2277 if git: |
|
2278 buildopts['git'] = get('git') |
|
2279 |
|
2280 # since this is in the experimental section, we need to call |
|
2281 # ui.configbool directory |
|
2282 buildopts['showsimilarity'] = ui.configbool('experimental', |
|
2283 'extendedheader.similarity') |
|
2284 |
|
2285 # need to inspect the ui object instead of using get() since we want to |
|
2286 # test for an int |
|
2287 hconf = ui.config('experimental', 'extendedheader.index') |
|
2288 if hconf is not None: |
|
2289 hlen = None |
|
2290 try: |
|
2291 # the hash config could be an integer (for length of hash) or a |
|
2292 # word (e.g. short, full, none) |
|
2293 hlen = int(hconf) |
|
2294 if hlen < 0 or hlen > 40: |
|
2295 msg = _("invalid length for extendedheader.index: '%d'\n") |
|
2296 ui.warn(msg % hlen) |
|
2297 except ValueError: |
|
2298 # default value |
|
2299 if hconf == 'short' or hconf == '': |
|
2300 hlen = 12 |
|
2301 elif hconf == 'full': |
|
2302 hlen = 40 |
|
2303 elif hconf != 'none': |
|
2304 msg = _("invalid value for extendedheader.index: '%s'\n") |
|
2305 ui.warn(msg % hconf) |
|
2306 finally: |
|
2307 buildopts['index'] = hlen |
|
2308 |
|
2309 if whitespace: |
|
2310 buildopts['ignorews'] = get('ignore_all_space', 'ignorews') |
|
2311 buildopts['ignorewsamount'] = get('ignore_space_change', |
|
2312 'ignorewsamount') |
|
2313 buildopts['ignoreblanklines'] = get('ignore_blank_lines', |
|
2314 'ignoreblanklines') |
|
2315 buildopts['ignorewseol'] = get('ignore_space_at_eol', 'ignorewseol') |
|
2316 if formatchanging: |
|
2317 buildopts['text'] = opts and opts.get('text') |
|
2318 binary = None if opts is None else opts.get('binary') |
|
2319 buildopts['nobinary'] = (not binary if binary is not None |
|
2320 else get('nobinary', forceplain=False)) |
|
2321 buildopts['noprefix'] = get('noprefix', forceplain=False) |
|
2322 |
|
2323 return mdiff.diffopts(**pycompat.strkwargs(buildopts)) |
|
2324 |
2239 |
2325 def diff(repo, node1=None, node2=None, match=None, changes=None, |
2240 def diff(repo, node1=None, node2=None, match=None, changes=None, |
2326 opts=None, losedatafn=None, prefix='', relroot='', copy=None, |
2241 opts=None, losedatafn=None, prefix='', relroot='', copy=None, |
2327 hunksfilterfn=None): |
2242 hunksfilterfn=None): |
2328 '''yields diff of changes to files between two nodes, or node and |
2243 '''yields diff of changes to files between two nodes, or node and |