Mercurial > public > mercurial-scm > hg
comparison mercurial/commands.py @ 1565:4bcbc126b80b
fix rename --after
author | Robin Farine <robin.farine@terminus.org> |
---|---|
date | Thu, 01 Dec 2005 10:48:35 -0600 |
parents | 9c6d0abdb94e |
children | b4956bbbadc9 |
comparison
equal
deleted
inserted
replaced
1564:34579a67fa71 | 1565:4bcbc126b80b |
---|---|
819 prevsrc = targets.get(abstarget) | 819 prevsrc = targets.get(abstarget) |
820 if prevsrc is not None: | 820 if prevsrc is not None: |
821 ui.warn(_('%s: not overwriting - %s collides with %s\n') % | 821 ui.warn(_('%s: not overwriting - %s collides with %s\n') % |
822 (reltarget, abssrc, prevsrc)) | 822 (reltarget, abssrc, prevsrc)) |
823 return | 823 return |
824 elif os.path.exists(reltarget): | 824 if (not opts['after'] and os.path.exists(reltarget) or |
825 if opts['force']: | 825 opts['after'] and repo.dirstate.state(abstarget) not in '?r'): |
826 os.unlink(reltarget) | 826 if not opts['force']: |
827 else: | |
828 ui.warn(_('%s: not overwriting - file exists\n') % | 827 ui.warn(_('%s: not overwriting - file exists\n') % |
829 reltarget) | 828 reltarget) |
830 return | 829 return |
831 if ui.verbose or not exact: | 830 if not opts['after']: |
832 ui.status(_('copying %s to %s\n') % (relsrc, reltarget)) | 831 os.unlink(reltarget) |
833 if not opts['after']: | 832 if opts['after']: |
833 if not os.path.exists(reltarget): | |
834 return | |
835 else: | |
834 targetdir = os.path.dirname(reltarget) or '.' | 836 targetdir = os.path.dirname(reltarget) or '.' |
835 if not os.path.isdir(targetdir): | 837 if not os.path.isdir(targetdir): |
836 os.makedirs(targetdir) | 838 os.makedirs(targetdir) |
837 try: | 839 try: |
838 shutil.copyfile(relsrc, reltarget) | 840 shutil.copyfile(relsrc, reltarget) |
845 else: | 847 else: |
846 ui.warn(_('%s: cannot copy - %s\n') % | 848 ui.warn(_('%s: cannot copy - %s\n') % |
847 (relsrc, inst.strerror)) | 849 (relsrc, inst.strerror)) |
848 errors += 1 | 850 errors += 1 |
849 return | 851 return |
852 if ui.verbose or not exact: | |
853 ui.status(_('copying %s to %s\n') % (relsrc, reltarget)) | |
850 targets[abstarget] = abssrc | 854 targets[abstarget] = abssrc |
851 repo.copy(abssrc, abstarget) | 855 repo.copy(abssrc, abstarget) |
852 copied.append((abssrc, relsrc, exact)) | 856 copied.append((abssrc, relsrc, exact)) |
857 | |
858 def targetpathfn(pat, dest, srcs): | |
859 if os.path.isdir(pat): | |
860 if pat.endswith(os.sep): | |
861 pat = pat[:-len(os.sep)] | |
862 if destdirexists: | |
863 striplen = len(os.path.split(pat)[0]) | |
864 else: | |
865 striplen = len(pat) | |
866 if striplen: | |
867 striplen += len(os.sep) | |
868 res = lambda p: os.path.join(dest, p[striplen:]) | |
869 elif destdirexists: | |
870 res = lambda p: os.path.join(dest, os.path.basename(p)) | |
871 else: | |
872 res = lambda p: dest | |
873 return res | |
874 | |
875 def targetpathafterfn(pat, dest, srcs): | |
876 if util.patkind(pat, None)[0]: | |
877 # a mercurial pattern | |
878 res = lambda p: os.path.join(dest, os.path.basename(p)) | |
879 elif len(util.canonpath(repo.root, cwd, pat)) < len(srcs[0][0]): | |
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[1][striplen:]) | |
886 if os.path.exists(t): | |
887 score += 1 | |
888 return score | |
889 | |
890 if pat.endswith(os.sep): | |
891 pat = pat[:-len(os.sep)] | |
892 striplen = len(pat) + len(os.sep) | |
893 if os.path.isdir(os.path.join(dest, os.path.split(pat)[1])): | |
894 score = evalpath(striplen) | |
895 striplen1 = len(os.path.split(pat)[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:]) | |
901 else: | |
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 | |
907 return res | |
908 | |
853 | 909 |
854 pats = list(pats) | 910 pats = list(pats) |
855 if not pats: | 911 if not pats: |
856 raise util.Abort(_('no source or destination specified')) | 912 raise util.Abort(_('no source or destination specified')) |
857 if len(pats) == 1: | 913 if len(pats) == 1: |
858 raise util.Abort(_('no destination specified')) | 914 raise util.Abort(_('no destination specified')) |
859 dest = pats.pop() | 915 dest = pats.pop() |
860 destdirexists = os.path.isdir(dest) | 916 destdirexists = os.path.isdir(dest) |
861 if (len(pats) > 1 or not os.path.exists(pats[0])) and not destdirexists: | 917 if (len(pats) > 1 or util.patkind(pats[0], None)[0]) and not destdirexists: |
862 raise util.Abort(_('with multiple sources, destination must be an ' | 918 raise util.Abort(_('with multiple sources, destination must be an ' |
863 'existing directory')) | 919 'existing directory')) |
864 | 920 if opts['after']: |
921 tfn = targetpathafterfn | |
922 else: | |
923 tfn = targetpathfn | |
924 copylist = [] | |
865 for pat in pats: | 925 for pat in pats: |
866 if os.path.isdir(pat): | 926 srcs = [] |
867 if destdirexists: | |
868 striplen = len(os.path.split(pat)[0]) | |
869 else: | |
870 striplen = len(pat) | |
871 if striplen: | |
872 striplen += len(os.sep) | |
873 targetpath = lambda p: os.path.join(dest, p[striplen:]) | |
874 elif destdirexists: | |
875 targetpath = lambda p: os.path.join(dest, os.path.basename(p)) | |
876 else: | |
877 targetpath = lambda p: dest | |
878 for tag, abssrc, relsrc, exact in walk(repo, [pat], opts): | 927 for tag, abssrc, relsrc, exact in walk(repo, [pat], opts): |
879 if okaytocopy(abssrc, relsrc, exact): | 928 if okaytocopy(abssrc, relsrc, exact): |
880 copy(abssrc, relsrc, targetpath(abssrc), exact) | 929 srcs.append((abssrc, relsrc, exact)) |
930 if not srcs: | |
931 continue | |
932 copylist.append((tfn(pat, dest, srcs), srcs)) | |
933 if not copylist: | |
934 raise util.Abort(_('no files to copy')) | |
935 | |
936 for targetpath, srcs in copylist: | |
937 for abssrc, relsrc, exact in srcs: | |
938 copy(abssrc, relsrc, targetpath(relsrc), exact) | |
881 | 939 |
882 if errors: | 940 if errors: |
883 ui.warn(_('(consider using --after)\n')) | 941 ui.warn(_('(consider using --after)\n')) |
884 if len(copied) == 0: | |
885 raise util.Abort(_('no files to copy')) | |
886 return errors, copied | 942 return errors, copied |
887 | 943 |
888 def copy(ui, repo, *pats, **opts): | 944 def copy(ui, repo, *pats, **opts): |
889 """mark files as copied for the next commit | 945 """mark files as copied for the next commit |
890 | 946 |