# HG changeset patch # User Matt Mackall # Date 1167444271 21600 # Node ID 67982d3ee76c0af24436af75bb27b0f6a83c8095 # Parent 656e06eebda7378d316966e7aa6f33ad1e5ce062 symlinks: add flags param to wwrite Now wwrite can set symlink and exec for files diff -r 656e06eebda7 -r 67982d3ee76c contrib/convert-repo --- a/contrib/convert-repo Fri Dec 29 20:04:31 2006 -0600 +++ b/contrib/convert-repo Fri Dec 29 20:04:31 2006 -0600 @@ -351,12 +351,10 @@ return [ hg.hex(x) for x in h ] def putfile(self, f, e, data): - self.repo.wfile(f, "w").write(data) + self.repo.wwrite(f, data, e and 'x' or '') if self.repo.dirstate.state(f) == '?': self.repo.dirstate.update([f], "a") - util.set_exec(self.repo.wjoin(f), e) - def delfile(self, f): try: os.unlink(self.repo.wjoin(f)) diff -r 656e06eebda7 -r 67982d3ee76c mercurial/localrepo.py --- a/mercurial/localrepo.py Fri Dec 29 20:04:31 2006 -0600 +++ b/mercurial/localrepo.py Fri Dec 29 20:04:31 2006 -0600 @@ -505,9 +505,19 @@ data = self.wopener(filename, 'r').read() return self._filter("encode", filename, data) - def wwrite(self, filename, data): + def wwrite(self, filename, data, flags): data = self._filter("decode", filename, data) - return self.wopener(filename, 'w').write(data) + if "l" in flags: + os.unlink(self.wjoin(filename)) + os.symlink(data, self.wjoin(filename)) + else: + try: + if self._link(filename): + os.unlink(self.wjoin(filename)) + except OSError: + pass + self.wopener(filename, 'w').write(data) + util.set_exec(self.wjoin(filename), "x" in flags) def wwritedata(self, filename, data): return self._filter("decode", filename, data) @@ -971,8 +981,7 @@ self.ui.warn("%s not removed!\n" % f) else: t = self.file(f).read(m[f]) - self.wwrite(f, t) - util.set_exec(self.wjoin(f), m.execf(f)) + self.wwrite(f, t, m.flags(f)) self.dirstate.update([f], "n") def copy(self, source, dest, wlock=None): diff -r 656e06eebda7 -r 67982d3ee76c mercurial/merge.py --- a/mercurial/merge.py Fri Dec 29 20:04:31 2006 -0600 +++ b/mercurial/merge.py Fri Dec 29 20:04:31 2006 -0600 @@ -346,7 +346,7 @@ merged += 1 if f != fd: repo.ui.debug(_("copying %s to %s\n") % (f, fd)) - repo.wwrite(fd, repo.wread(f)) + repo.wwrite(fd, repo.wread(f), flag and 'x' or '') if move: repo.ui.debug(_("removing %s\n") % f) os.unlink(repo.wjoin(f)) @@ -355,22 +355,19 @@ flag = a[2] repo.ui.note(_("getting %s\n") % f) t = mctx.filectx(f).data() - repo.wwrite(f, t) - util.set_exec(repo.wjoin(f), flag) + repo.wwrite(f, t, flag and 'x' or '') updated += 1 elif m == "d": # directory rename f2, fd, flag = a[2:] if f: repo.ui.note(_("moving %s to %s\n") % (f, fd)) t = wctx.filectx(f).data() - repo.wwrite(fd, t) - util.set_exec(repo.wjoin(fd), flag) + repo.wwrite(fd, t, flag and 'x' or '') util.unlink(repo.wjoin(f)) if f2: repo.ui.note(_("getting %s to %s\n") % (f2, fd)) t = mctx.filectx(f2).data() - repo.wwrite(fd, t) - util.set_exec(repo.wjoin(fd), flag) + repo.wwrite(fd, t, flag and 'x' or '') updated += 1 elif m == "e": # exec flag = a[2] diff -r 656e06eebda7 -r 67982d3ee76c mercurial/patch.py --- a/mercurial/patch.py Fri Dec 29 20:04:31 2006 -0600 +++ b/mercurial/patch.py Fri Dec 29 20:04:31 2006 -0600 @@ -377,8 +377,9 @@ dst = os.path.join(repo.root, gp.path) # patch won't create empty files if ctype == 'ADD' and not os.path.exists(dst): - repo.wwrite(gp.path, '') - util.set_exec(dst, x) + repo.wwrite(gp.path, '', x and 'x' or '') + else: + util.set_exec(dst, x) cmdutil.addremove(repo, cfiles, wlock=wlock) files = patches.keys() files.extend([r for r in removes if r not in files])