Mercurial > public > mercurial-scm > hg
comparison mercurial/hg.py @ 579:ffeb2c3a1966
Actually warn on pulling from an unrelated repository
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Actually warn on pulling from an unrelated repository
add some comments to findincoming
track the base nodes of the fetch set
report if the base set only contains nullid
add a test case
manifest hash: 3fc038a6041b0967a20503f5ec8876efc038841a
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.0 (GNU/Linux)
iD8DBQFCx0yLywK+sNU5EO8RAlK6AJ9J/GKPpYSMzTqmguXPWOISJ+zY5gCghd+j
ClLpn0dKZnB46dh0F8zhuuk=
=emNb
-----END PGP SIGNATURE-----
author | mpm@selenic.com |
---|---|
date | Sat, 02 Jul 2005 18:25:15 -0800 |
parents | e33c85d2812a |
children | df8a5a0098d4 |
comparison
equal
deleted
inserted
replaced
578:e33c85d2812a | 579:ffeb2c3a1966 |
---|---|
850 | 850 |
851 def findincoming(self, remote): | 851 def findincoming(self, remote): |
852 m = self.changelog.nodemap | 852 m = self.changelog.nodemap |
853 search = [] | 853 search = [] |
854 fetch = [] | 854 fetch = [] |
855 base = {} | |
855 seen = {} | 856 seen = {} |
856 seenbranch = {} | 857 seenbranch = {} |
857 | 858 |
858 # if we have an empty repo, fetch everything | 859 # if we have an empty repo, fetch everything |
859 if self.changelog.tip() == nullid: | 860 if self.changelog.tip() == nullid: |
860 self.ui.status("requesting all changes\n") | 861 self.ui.status("requesting all changes\n") |
861 return [nullid] | 862 return [nullid] |
862 | 863 |
863 # otherwise, assume we're closer to the tip than the root | 864 # otherwise, assume we're closer to the tip than the root |
865 # and start by examining the heads | |
864 self.ui.status("searching for changes\n") | 866 self.ui.status("searching for changes\n") |
865 heads = remote.heads() | 867 heads = remote.heads() |
866 unknown = [] | 868 unknown = [] |
867 for h in heads: | 869 for h in heads: |
868 if h not in m: | 870 if h not in m: |
872 return None | 874 return None |
873 | 875 |
874 rep = {} | 876 rep = {} |
875 reqcnt = 0 | 877 reqcnt = 0 |
876 | 878 |
879 # search through remote branches | |
880 # a 'branch' here is a linear segment of history, with four parts: | |
881 # head, root, first parent, second parent | |
882 # (a branch always has two parents (or none) by definition) | |
877 unknown = remote.branches(unknown) | 883 unknown = remote.branches(unknown) |
878 while unknown: | 884 while unknown: |
879 r = [] | 885 r = [] |
880 while unknown: | 886 while unknown: |
881 n = unknown.pop(0) | 887 n = unknown.pop(0) |
897 if n[1] not in seen and n[1] not in fetch: | 903 if n[1] not in seen and n[1] not in fetch: |
898 if n[2] in m and n[3] in m: | 904 if n[2] in m and n[3] in m: |
899 self.ui.debug("found new changeset %s\n" % | 905 self.ui.debug("found new changeset %s\n" % |
900 short(n[1])) | 906 short(n[1])) |
901 fetch.append(n[1]) # earliest unknown | 907 fetch.append(n[1]) # earliest unknown |
908 base[n[2]] = 1 # latest known | |
902 continue | 909 continue |
903 | 910 |
904 for a in n[2:4]: | 911 for a in n[2:4]: |
905 if a not in rep: | 912 if a not in rep: |
906 r.append(a) | 913 r.append(a) |
917 self.ui.debug("received %s:%s\n" % | 924 self.ui.debug("received %s:%s\n" % |
918 (short(b[0]), short(b[1]))) | 925 (short(b[0]), short(b[1]))) |
919 if b[0] not in m and b[0] not in seen: | 926 if b[0] not in m and b[0] not in seen: |
920 unknown.append(b) | 927 unknown.append(b) |
921 | 928 |
929 # do binary search on the branches we found | |
922 while search: | 930 while search: |
923 n = search.pop(0) | 931 n = search.pop(0) |
924 reqcnt += 1 | 932 reqcnt += 1 |
925 l = remote.between([(n[0], n[1])])[0] | 933 l = remote.between([(n[0], n[1])])[0] |
926 l.append(n[1]) | 934 l.append(n[1]) |
931 if i in m: | 939 if i in m: |
932 if f <= 2: | 940 if f <= 2: |
933 self.ui.debug("found new branch changeset %s\n" % | 941 self.ui.debug("found new branch changeset %s\n" % |
934 short(p)) | 942 short(p)) |
935 fetch.append(p) | 943 fetch.append(p) |
944 base[i] = 1 | |
936 else: | 945 else: |
937 self.ui.debug("narrowed branch search to %s:%s\n" | 946 self.ui.debug("narrowed branch search to %s:%s\n" |
938 % (short(p), short(i))) | 947 % (short(p), short(i))) |
939 search.append((p, i)) | 948 search.append((p, i)) |
940 break | 949 break |
941 p, f = i, f * 2 | 950 p, f = i, f * 2 |
942 | 951 |
952 # sanity check our fetch list | |
943 for f in fetch: | 953 for f in fetch: |
944 if f in m: | 954 if f in m: |
945 raise RepoError("already have changeset " + short(f[:4])) | 955 raise RepoError("already have changeset " + short(f[:4])) |
946 | 956 |
947 if fetch == [nullid]: | 957 if base.keys() == [nullid]: |
948 self.ui.warn("warning: pulling from an unrelated repository!\n") | 958 self.ui.warn("warning: pulling from an unrelated repository!\n") |
949 | 959 |
950 self.ui.note("adding new changesets starting at " + | 960 self.ui.note("adding new changesets starting at " + |
951 " ".join([short(f) for f in fetch]) + "\n") | 961 " ".join([short(f) for f in fetch]) + "\n") |
952 | 962 |