##// END OF EJS Templates
revert: don't backup if no files reverted in interactive mode (issue4793)...
skarlage -
r29498:1b38cfde default
parent child Browse files
Show More
@@ -3143,11 +3143,17 def revert(ui, repo, ctx, parents, *pats
3143 # All set to `discard` if `no-backup` is set do avoid checking
3143 # All set to `discard` if `no-backup` is set do avoid checking
3144 # no_backup lower in the code.
3144 # no_backup lower in the code.
3145 # These values are ordered for comparison purposes
3145 # These values are ordered for comparison purposes
3146 backupinteractive = 3 # do backup if interactively modified
3146 backup = 2 # unconditionally do backup
3147 backup = 2 # unconditionally do backup
3147 check = 1 # check if the existing file differs from target
3148 check = 1 # check if the existing file differs from target
3148 discard = 0 # never do backup
3149 discard = 0 # never do backup
3149 if opts.get('no_backup'):
3150 if opts.get('no_backup'):
3150 backup = check = discard
3151 backupinteractive = backup = check = discard
3152 if interactive:
3153 dsmodifiedbackup = backupinteractive
3154 else:
3155 dsmodifiedbackup = backup
3156 tobackup = set()
3151
3157
3152 backupanddel = actions['remove']
3158 backupanddel = actions['remove']
3153 if not opts.get('no_backup'):
3159 if not opts.get('no_backup'):
@@ -3165,7 +3171,7 def revert(ui, repo, ctx, parents, *pats
3165 # Modified compared to target, but local file is deleted
3171 # Modified compared to target, but local file is deleted
3166 (deleted, actions['revert'], discard),
3172 (deleted, actions['revert'], discard),
3167 # Modified compared to target, local change
3173 # Modified compared to target, local change
3168 (dsmodified, actions['revert'], backup),
3174 (dsmodified, actions['revert'], dsmodifiedbackup),
3169 # Added since target
3175 # Added since target
3170 (added, actions['remove'], discard),
3176 (added, actions['remove'], discard),
3171 # Added in working directory
3177 # Added in working directory
@@ -3200,8 +3206,12 def revert(ui, repo, ctx, parents, *pats
3200 continue
3206 continue
3201 if xlist is not None:
3207 if xlist is not None:
3202 xlist.append(abs)
3208 xlist.append(abs)
3203 if dobackup and (backup <= dobackup
3209 if dobackup:
3204 or wctx[abs].cmp(ctx[abs])):
3210 # If in interactive mode, don't automatically create
3211 # .orig files (issue4793)
3212 if dobackup == backupinteractive:
3213 tobackup.add(abs)
3214 elif (backup <= dobackup or wctx[abs].cmp(ctx[abs])):
3205 bakname = scmutil.origpath(ui, repo, rel)
3215 bakname = scmutil.origpath(ui, repo, rel)
3206 ui.note(_('saving current version of %s as %s\n') %
3216 ui.note(_('saving current version of %s as %s\n') %
3207 (rel, bakname))
3217 (rel, bakname))
@@ -3221,7 +3231,7 def revert(ui, repo, ctx, parents, *pats
3221 if not opts.get('dry_run'):
3231 if not opts.get('dry_run'):
3222 needdata = ('revert', 'add', 'undelete')
3232 needdata = ('revert', 'add', 'undelete')
3223 _revertprefetch(repo, ctx, *[actions[name][0] for name in needdata])
3233 _revertprefetch(repo, ctx, *[actions[name][0] for name in needdata])
3224 _performrevert(repo, parents, ctx, actions, interactive)
3234 _performrevert(repo, parents, ctx, actions, interactive, tobackup)
3225
3235
3226 if targetsubs:
3236 if targetsubs:
3227 # Revert the subrepos on the revert list
3237 # Revert the subrepos on the revert list
@@ -3236,7 +3246,8 def _revertprefetch(repo, ctx, *files):
3236 """Let extension changing the storage layer prefetch content"""
3246 """Let extension changing the storage layer prefetch content"""
3237 pass
3247 pass
3238
3248
3239 def _performrevert(repo, parents, ctx, actions, interactive=False):
3249 def _performrevert(repo, parents, ctx, actions, interactive=False,
3250 tobackup=None):
3240 """function that actually perform all the actions computed for revert
3251 """function that actually perform all the actions computed for revert
3241
3252
3242 This is an independent function to let extension to plug in and react to
3253 This is an independent function to let extension to plug in and react to
@@ -3316,9 +3327,18 def _performrevert(repo, parents, ctx, a
3316 raise error.Abort(_('error parsing patch: %s') % err)
3327 raise error.Abort(_('error parsing patch: %s') % err)
3317
3328
3318 newlyaddedandmodifiedfiles = newandmodified(chunks, originalchunks)
3329 newlyaddedandmodifiedfiles = newandmodified(chunks, originalchunks)
3330 if tobackup is None:
3331 tobackup = set()
3319 # Apply changes
3332 # Apply changes
3320 fp = stringio()
3333 fp = stringio()
3321 for c in chunks:
3334 for c in chunks:
3335 # Create a backup file only if this hunk should be backed up
3336 if ishunk(c) and c.header.filename() in tobackup:
3337 abs = c.header.filename()
3338 target = repo.wjoin(abs)
3339 bakname = scmutil.origpath(repo.ui, repo, m.rel(abs))
3340 util.copyfile(target, bakname)
3341 tobackup.remove(abs)
3322 c.write(fp)
3342 c.write(fp)
3323 dopatch = fp.tell()
3343 dopatch = fp.tell()
3324 fp.seek(0)
3344 fp.seek(0)
@@ -134,7 +134,41 Test that --interactive lift the need fo
134
134
135 abort: user quit
135 abort: user quit
136 [255]
136 [255]
137 $ rm folder1/g.orig
137 $ ls folder1/
138 g
139
140 Test that a noop revert doesn't do an unecessary backup
141 $ (echo y; echo n) | hg revert -i -r 2 folder1/g
142 diff --git a/folder1/g b/folder1/g
143 1 hunks, 1 lines changed
144 examine changes to 'folder1/g'? [Ynesfdaq?] y
145
146 @@ -3,3 +3,4 @@
147 3
148 4
149 5
150 +d
151 revert this change to 'folder1/g'? [Ynesfdaq?] n
152
153 $ ls folder1/
154 g
155
156 Test --no-backup
157 $ (echo y; echo y) | hg revert -i -C -r 2 folder1/g
158 diff --git a/folder1/g b/folder1/g
159 1 hunks, 1 lines changed
160 examine changes to 'folder1/g'? [Ynesfdaq?] y
161
162 @@ -3,3 +3,4 @@
163 3
164 4
165 5
166 +d
167 revert this change to 'folder1/g'? [Ynesfdaq?] y
168
169 $ ls folder1/
170 g
171 >>> open('folder1/g', 'wb').write("1\n2\n3\n4\n5\nd\n")
138
172
139
173
140 $ hg update -C 6
174 $ hg update -C 6
General Comments 0
You need to be logged in to leave comments. Login now