comparison mercurial/commands.py @ 1633:94c179a92f4a

copy/rename '.' or '..' correctly
author Robin Farine <robin.farine@terminus.org>
date Tue, 24 Jan 2006 13:57:09 +1300
parents f2b1df3dbcbb
children f49f602fae92
comparison
equal deleted inserted replaced
1632:3f214984fd9e 1633:94c179a92f4a
854 repo.copy(abssrc, abstarget) 854 repo.copy(abssrc, abstarget)
855 copied.append((abssrc, relsrc, exact)) 855 copied.append((abssrc, relsrc, exact))
856 856
857 def targetpathfn(pat, dest, srcs): 857 def targetpathfn(pat, dest, srcs):
858 if os.path.isdir(pat): 858 if os.path.isdir(pat):
859 if pat.endswith(os.sep): 859 abspfx = util.canonpath(repo.root, cwd, pat)
860 pat = pat[:-len(os.sep)]
861 if destdirexists: 860 if destdirexists:
862 striplen = len(os.path.split(pat)[0]) 861 striplen = len(os.path.split(abspfx)[0])
863 else: 862 else:
864 striplen = len(pat) 863 striplen = len(abspfx)
865 if striplen: 864 if striplen:
866 striplen += len(os.sep) 865 striplen += len(os.sep)
867 res = lambda p: os.path.join(dest, p[striplen:]) 866 res = lambda p: os.path.join(dest, p[striplen:])
868 elif destdirexists: 867 elif destdirexists:
869 res = lambda p: os.path.join(dest, os.path.basename(p)) 868 res = lambda p: os.path.join(dest, os.path.basename(p))
873 872
874 def targetpathafterfn(pat, dest, srcs): 873 def targetpathafterfn(pat, dest, srcs):
875 if util.patkind(pat, None)[0]: 874 if util.patkind(pat, None)[0]:
876 # a mercurial pattern 875 # a mercurial pattern
877 res = lambda p: os.path.join(dest, os.path.basename(p)) 876 res = lambda p: os.path.join(dest, os.path.basename(p))
878 elif len(util.canonpath(repo.root, cwd, pat)) < len(srcs[0][0]):
879 # A directory. Either the target path contains the last
880 # component of the source path or it does not.
881 def evalpath(striplen):
882 score = 0
883 for s in srcs:
884 t = os.path.join(dest, s[1][striplen:])
885 if os.path.exists(t):
886 score += 1
887 return score
888
889 if pat.endswith(os.sep):
890 pat = pat[:-len(os.sep)]
891 striplen = len(pat) + len(os.sep)
892 if os.path.isdir(os.path.join(dest, os.path.split(pat)[1])):
893 score = evalpath(striplen)
894 striplen1 = len(os.path.split(pat)[0])
895 if striplen1:
896 striplen1 += len(os.sep)
897 if evalpath(striplen1) > score:
898 striplen = striplen1
899 res = lambda p: os.path.join(dest, p[striplen:])
900 else: 877 else:
901 # a file 878 abspfx = util.canonpath(repo.root, cwd, pat)
902 if destdirexists: 879 if len(abspfx) < len(srcs[0][0]):
903 res = lambda p: os.path.join(dest, os.path.basename(p)) 880 # A directory. Either the target path contains the last
881 # component of the source path or it does not.
882 def evalpath(striplen):
883 score = 0
884 for s in srcs:
885 t = os.path.join(dest, s[0][striplen:])
886 if os.path.exists(t):
887 score += 1
888 return score
889
890 striplen = len(abspfx)
891 if striplen:
892 striplen += len(os.sep)
893 if os.path.isdir(os.path.join(dest, os.path.split(abspfx)[1])):
894 score = evalpath(striplen)
895 striplen1 = len(os.path.split(abspfx)[0])
896 if striplen1:
897 striplen1 += len(os.sep)
898 if evalpath(striplen1) > score:
899 striplen = striplen1
900 res = lambda p: os.path.join(dest, p[striplen:])
904 else: 901 else:
905 res = lambda p: dest 902 # a file
903 if destdirexists:
904 res = lambda p: os.path.join(dest, os.path.basename(p))
905 else:
906 res = lambda p: dest
906 return res 907 return res
907 908
908 909
909 pats = list(pats) 910 pats = list(pats)
910 if not pats: 911 if not pats:
932 if not copylist: 933 if not copylist:
933 raise util.Abort(_('no files to copy')) 934 raise util.Abort(_('no files to copy'))
934 935
935 for targetpath, srcs in copylist: 936 for targetpath, srcs in copylist:
936 for abssrc, relsrc, exact in srcs: 937 for abssrc, relsrc, exact in srcs:
937 copy(abssrc, relsrc, targetpath(relsrc), exact) 938 copy(abssrc, relsrc, targetpath(abssrc), exact)
938 939
939 if errors: 940 if errors:
940 ui.warn(_('(consider using --after)\n')) 941 ui.warn(_('(consider using --after)\n'))
941 return errors, copied 942 return errors, copied
942 943