[PATCH] for issue 516 - can't revert or rename a symlink to a
directory
Eric St-Jean
esj at wwd.ca
Thu Mar 15 09:10:37 CDT 2007
Should i do something else to get this patch into hg???
I'd really like to see it fixed.
thank you!
Eric St-Jean wrote:
> This should fix issue 516.
> Patch attached which fixes all issues: rename and revert a symbolic link
> which
> points to a directory (doesn't matter what it points to in the repo; the
> bug is
> triggered by the link currently pointing to a dir), and reverting a dangling
> symlink will (correctly, i think) save the original link in *.orig.
> I don't think the patch breaks anything, but i also do not think it's
> all correct wrt OS-abstraction. I tried to make it so it should work on
> nt, but maybe it wouldn't.
>
> ------------------------------------------------------------------------
>
> # HG changeset patch
> # User Eric St-Jean <eric.st-jean at jeppesen.com>
> # Date 1173846350 14400
> # Node ID 3e0aac81c5dc32d7d55bfb31f954c7bd3ff58333
> # Parent c0271aba6abe6f5c9da103bafb10821a84dc6140
> First shot at issue 516: big with reverting / renaming a symlink which now points to a directory
>
> diff -r c0271aba6abe -r 3e0aac81c5dc mercurial/commands.py
> --- a/mercurial/commands.py Thu Mar 08 20:08:24 2007 -0300
> +++ b/mercurial/commands.py Wed Mar 14 00:25:50 2007 -0400
> @@ -2203,7 +2203,7 @@ def revert(ui, repo, *pats, **opts):
> def handle(xlist, dobackup):
> xlist[0].append(abs)
> update[abs] = 1
> - if dobackup and not opts['no_backup'] and os.path.exists(rel):
> + if dobackup and not opts['no_backup'] and (util.is_link(rel) or os.path.exists(rel)):
> bakname = "%s.orig" % rel
> ui.note(_('saving current version of %s as %s\n') %
> (rel, bakname))
> @@ -3304,3 +3304,4 @@ def dispatch(args):
> raise
>
> return -1
> +run()
> \ No newline at end of file
> diff -r c0271aba6abe -r 3e0aac81c5dc mercurial/localrepo.py
> --- a/mercurial/localrepo.py Thu Mar 08 20:08:24 2007 -0300
> +++ b/mercurial/localrepo.py Wed Mar 14 00:25:50 2007 -0400
> @@ -1040,10 +1040,10 @@ class localrepository(repo.repository):
>
> def copy(self, source, dest, wlock=None):
> p = self.wjoin(dest)
> - if not os.path.exists(p):
> + if not (os.path.exists(p) or self._link(p)):
> self.ui.warn(_("%s does not exist!\n") % dest)
> - elif not os.path.isfile(p):
> - self.ui.warn(_("copy failed: %s is not a file\n") % dest)
> + elif not (os.path.isfile(p) or self._link(p)):
> + self.ui.warn(_("copy failed: %s is not a file or a symbolic link\n") % dest)
> else:
> if not wlock:
> wlock = self.wlock()
> diff -r c0271aba6abe -r 3e0aac81c5dc mercurial/util.py
> --- a/mercurial/util.py Thu Mar 08 20:08:24 2007 -0300
> +++ b/mercurial/util.py Wed Mar 14 00:25:50 2007 -0400
> @@ -591,8 +591,14 @@ def copyfile(src, dest):
> def copyfile(src, dest):
> "copy a file, preserving mode"
> try:
> - shutil.copyfile(src, dest)
> - shutil.copymode(src, dest)
> + if is_link(src):
> + try:
> + os.symlink(os.readlink(src),dest)
> + except OSError:
> + open(dst,'w').write(os.readlink(src))
> + else:
> + shutil.copyfile(src, dest)
> + shutil.copymode(src, dest)
> except shutil.Error, inst:
> raise Abort(str(inst))
>
> @@ -616,6 +622,11 @@ def copyfiles(src, dst, hardlink=None):
> except (IOError, OSError):
> hardlink = False
> shutil.copy(src, dst)
> + elif is_link(src):
> + try:
> + os.symlink(os.readlink(src),dest)
> + except OSError:
> + open(dst,'w').write(os.readlink(src))
> else:
> shutil.copy(src, dst)
>
> @@ -836,6 +847,9 @@ if os.name == 'nt':
> def set_link(f, mode):
> pass
>
> + def is_link(f):
> + return False
> +
> def set_binary(fd):
> msvcrt.setmode(fd.fileno(), os.O_BINARY)
>
>
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at selenic.com
> http://selenic.com/mailman/listinfo/mercurial-devel
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: esj.vcf
Type: text/x-vcard
Size: 161 bytes
Desc: not available
Url : http://www.selenic.com/pipermail/mercurial-devel/attachments/20070315/dbb36e3b/esj.vcf
More information about the Mercurial-devel
mailing list