2120 if opts.git or opts.upgrade: |
2120 if opts.git or opts.upgrade: |
2121 copy = copies.pathcopies(ctx1, ctx2) |
2121 copy = copies.pathcopies(ctx1, ctx2) |
2122 |
2122 |
2123 def difffn(opts, losedata): |
2123 def difffn(opts, losedata): |
2124 return trydiff(repo, revs, ctx1, ctx2, modified, added, removed, |
2124 return trydiff(repo, revs, ctx1, ctx2, modified, added, removed, |
2125 copy, getfilectx, opts, losedata, prefix) |
2125 copy, getfilectx, opts, losedata, prefix, '') |
2126 if opts.upgrade and not opts.git: |
2126 if opts.upgrade and not opts.git: |
2127 try: |
2127 try: |
2128 def losedata(fn): |
2128 def losedata(fn): |
2129 if not losedatafn or not losedatafn(fn=fn): |
2129 if not losedatafn or not losedatafn(fn=fn): |
2130 raise GitDiffRequired |
2130 raise GitDiffRequired |
2228 and copy[copyto[f]] == f): |
2228 and copy[copyto[f]] == f): |
2229 continue |
2229 continue |
2230 yield f1, f2, copyop |
2230 yield f1, f2, copyop |
2231 |
2231 |
2232 def trydiff(repo, revs, ctx1, ctx2, modified, added, removed, |
2232 def trydiff(repo, revs, ctx1, ctx2, modified, added, removed, |
2233 copy, getfilectx, opts, losedatafn, prefix): |
2233 copy, getfilectx, opts, losedatafn, prefix, relroot): |
2234 '''given input data, generate a diff and yield it in blocks |
2234 '''given input data, generate a diff and yield it in blocks |
2235 |
2235 |
2236 If generating a diff would lose data like flags or binary data and |
2236 If generating a diff would lose data like flags or binary data and |
2237 losedatafn is not None, it will be called. |
2237 losedatafn is not None, it will be called. |
2238 |
2238 |
2239 prefix is added to every path in the diff output.''' |
2239 relroot is removed and prefix is added to every path in the diff output. |
|
2240 |
|
2241 If relroot is not empty, this function expects every path in modified, |
|
2242 added, removed and copy to start with it.''' |
2240 |
2243 |
2241 def gitindex(text): |
2244 def gitindex(text): |
2242 if not text: |
2245 if not text: |
2243 text = "" |
2246 text = "" |
2244 l = len(text) |
2247 l = len(text) |
2258 |
2261 |
2259 date1 = util.datestr(ctx1.date()) |
2262 date1 = util.datestr(ctx1.date()) |
2260 date2 = util.datestr(ctx2.date()) |
2263 date2 = util.datestr(ctx2.date()) |
2261 |
2264 |
2262 gitmode = {'l': '120000', 'x': '100755', '': '100644'} |
2265 gitmode = {'l': '120000', 'x': '100755', '': '100644'} |
|
2266 |
|
2267 if relroot != '' and (repo.ui.configbool('devel', 'all') |
|
2268 or repo.ui.configbool('devel', 'check-relroot')): |
|
2269 for f in modified + added + removed + copy.keys() + copy.values(): |
|
2270 if f is not None and not f.startswith(relroot): |
|
2271 raise AssertionError( |
|
2272 "file %s doesn't start with relroot %s" % (f, relroot)) |
2263 |
2273 |
2264 for f1, f2, copyop in _filepairs( |
2274 for f1, f2, copyop in _filepairs( |
2265 ctx1, modified, added, removed, copy, opts): |
2275 ctx1, modified, added, removed, copy, opts): |
2266 content1 = None |
2276 content1 = None |
2267 content2 = None |
2277 content2 = None |
2291 (not f1 and flag2) or |
2301 (not f1 and flag2) or |
2292 # change flags |
2302 # change flags |
2293 (f1 and f2 and flag1 != flag2)): |
2303 (f1 and f2 and flag1 != flag2)): |
2294 losedatafn(f2 or f1) |
2304 losedatafn(f2 or f1) |
2295 |
2305 |
2296 path1 = posixpath.join(prefix, f1 or f2) |
2306 path1 = f1 or f2 |
2297 path2 = posixpath.join(prefix, f2 or f1) |
2307 path2 = f2 or f1 |
|
2308 path1 = posixpath.join(prefix, path1[len(relroot):]) |
|
2309 path2 = posixpath.join(prefix, path2[len(relroot):]) |
2298 header = [] |
2310 header = [] |
2299 if opts.git: |
2311 if opts.git: |
2300 header.append('diff --git %s%s %s%s' % |
2312 header.append('diff --git %s%s %s%s' % |
2301 (aprefix, path1, bprefix, path2)) |
2313 (aprefix, path1, bprefix, path2)) |
2302 if not f1: # added |
2314 if not f1: # added |