comparison hgext/extdiff.py @ 5110:2be225ea5722

extdiff: do single file diffs from the wc with no copy Extdiff was always making a temporary directory and copying files even when not required. This change makes extdiff avoid the copy when diffing a single file that lives in the wc. This lets external diff tools edit the working copy file directly. It also lets other extensions resuse the functions in extdiff and get in-place diffs.
author Brad Schick <schickb@gmail.com>
date Mon, 06 Aug 2007 14:50:57 -0700
parents 841568ccc09d
children d4fa6bafc43a
comparison
equal deleted inserted replaced
5109:841568ccc09d 5110:2be225ea5722
111 node1, node2, files, match=matchfn)[:5] 111 node1, node2, files, match=matchfn)[:5]
112 if not (modified or added or removed): 112 if not (modified or added or removed):
113 return 0 113 return 0
114 114
115 tmproot = tempfile.mkdtemp(prefix='extdiff.') 115 tmproot = tempfile.mkdtemp(prefix='extdiff.')
116 dir2root = ''
116 try: 117 try:
118 # Always make a copy of node1
117 dir1 = snapshot_node(ui, repo, modified + removed, node1, tmproot) 119 dir1 = snapshot_node(ui, repo, modified + removed, node1, tmproot)
120 changes = len(modified) + len(removed) + len(added)
121
122 # If node2 in not the wc or there is >1 change, copy it
118 if node2: 123 if node2:
119 dir2 = snapshot_node(ui, repo, modified + added, node2, tmproot) 124 dir2 = snapshot_node(ui, repo, modified + added, node2, tmproot)
125 elif changes > 1:
126 dir2 = snapshot_wdir(ui, repo, modified + added, tmproot)
120 else: 127 else:
121 dir2 = snapshot_wdir(ui, repo, modified + added, tmproot) 128 # This lets the diff tool open the changed file directly
129 dir2 = ''
130 dir2root = repo.root
131
132 # If only one change, diff the files instead of the directories
133 if changes == 1 :
134 if len(modified):
135 dir1 = os.path.join(dir1, util.localpath(modified[0]))
136 dir2 = os.path.join(dir2root, dir2, util.localpath(modified[0]))
137 elif len(removed) :
138 dir1 = os.path.join(dir1, util.localpath(removed[0]))
139 dir2 = os.devnull
140 else:
141 dir1 = os.devnull
142 dir2 = os.path.join(dir2root, dir2, util.localpath(added[0]))
143
122 cmdline = ('%s %s %s %s' % 144 cmdline = ('%s %s %s %s' %
123 (util.shellquote(diffcmd), ' '.join(diffopts), 145 (util.shellquote(diffcmd), ' '.join(diffopts),
124 util.shellquote(dir1), util.shellquote(dir2))) 146 util.shellquote(dir1), util.shellquote(dir2)))
125 ui.debug('running %r in %s\n' % (cmdline, tmproot)) 147 ui.debug('running %r in %s\n' % (cmdline, tmproot))
126 util.system(cmdline, cwd=tmproot) 148 util.system(cmdline, cwd=tmproot)