[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