Mercurial > hg > pyhgsh
comparison mercurial/localrepo.py @ 2346:925610b2d90a
merge with crew
author | Benoit Boissinot <benoit.boissinot@ens-lyon.org> |
---|---|
date | Wed, 24 May 2006 09:27:16 +0200 |
parents | 4f7745fc9823 11422943cf72 |
children | 5b178298b7f4 |
comparison
equal
deleted
inserted
replaced
2345:4f7745fc9823 | 2346:925610b2d90a |
---|---|
10 from node import * | 10 from node import * |
11 from i18n import gettext as _ | 11 from i18n import gettext as _ |
12 from demandload import * | 12 from demandload import * |
13 demandload(globals(), "appendfile changegroup") | 13 demandload(globals(), "appendfile changegroup") |
14 demandload(globals(), "re lock transaction tempfile stat mdiff errno ui") | 14 demandload(globals(), "re lock transaction tempfile stat mdiff errno ui") |
15 demandload(globals(), "revlog traceback") | 15 demandload(globals(), "revlog") |
16 | 16 |
17 class localrepository(object): | 17 class localrepository(object): |
18 def __del__(self): | 18 def __del__(self): |
19 self.transhandle = None | 19 self.transhandle = None |
20 def __init__(self, parentui, path=None, create=0): | 20 def __init__(self, parentui, path=None, create=0): |
123 else: | 123 else: |
124 self.ui.warn(_('error: %s hook raised an exception: ' | 124 self.ui.warn(_('error: %s hook raised an exception: ' |
125 '%s\n') % (hname, exc)) | 125 '%s\n') % (hname, exc)) |
126 if throw: | 126 if throw: |
127 raise | 127 raise |
128 if self.ui.traceback: | 128 self.ui.print_exc() |
129 traceback.print_exc() | |
130 return True | 129 return True |
131 if r: | 130 if r: |
132 if throw: | 131 if throw: |
133 raise util.Abort(_('%s hook failed') % hname) | 132 raise util.Abort(_('%s hook failed') % hname) |
134 self.ui.warn(_('warning: %s hook failed\n') % hname) | 133 self.ui.warn(_('warning: %s hook failed\n') % hname) |
898 r.append(l) | 897 r.append(l) |
899 | 898 |
900 return r | 899 return r |
901 | 900 |
902 def findincoming(self, remote, base=None, heads=None, force=False): | 901 def findincoming(self, remote, base=None, heads=None, force=False): |
902 """Return list of roots of the subsets of missing nodes from remote | |
903 | |
904 If base dict is specified, assume that these nodes and their parents | |
905 exist on the remote side and that no child of a node of base exists | |
906 in both remote and self. | |
907 Furthermore base will be updated to include the nodes that exists | |
908 in self and remote but no children exists in self and remote. | |
909 If a list of heads is specified, return only nodes which are heads | |
910 or ancestors of these heads. | |
911 | |
912 All the ancestors of base are in self and in remote. | |
913 All the descendants of the list returned are missing in self. | |
914 (and so we know that the rest of the nodes are missing in remote, see | |
915 outgoing) | |
916 """ | |
903 m = self.changelog.nodemap | 917 m = self.changelog.nodemap |
904 search = [] | 918 search = [] |
905 fetch = {} | 919 fetch = {} |
906 seen = {} | 920 seen = {} |
907 seenbranch = {} | 921 seenbranch = {} |
910 | 924 |
911 if not heads: | 925 if not heads: |
912 heads = remote.heads() | 926 heads = remote.heads() |
913 | 927 |
914 if self.changelog.tip() == nullid: | 928 if self.changelog.tip() == nullid: |
929 base[nullid] = 1 | |
915 if heads != [nullid]: | 930 if heads != [nullid]: |
916 return [nullid] | 931 return [nullid] |
917 return [] | 932 return [] |
918 | 933 |
919 # assume we're closer to the tip than the root | 934 # assume we're closer to the tip than the root |
928 base[h] = 1 | 943 base[h] = 1 |
929 | 944 |
930 if not unknown: | 945 if not unknown: |
931 return [] | 946 return [] |
932 | 947 |
933 rep = {} | 948 req = dict.fromkeys(unknown) |
934 reqcnt = 0 | 949 reqcnt = 0 |
935 | 950 |
936 # search through remote branches | 951 # search through remote branches |
937 # a 'branch' here is a linear segment of history, with four parts: | 952 # a 'branch' here is a linear segment of history, with four parts: |
938 # head, root, first parent, second parent | 953 # head, root, first parent, second parent |
945 if n[0] in seen: | 960 if n[0] in seen: |
946 continue | 961 continue |
947 | 962 |
948 self.ui.debug(_("examining %s:%s\n") | 963 self.ui.debug(_("examining %s:%s\n") |
949 % (short(n[0]), short(n[1]))) | 964 % (short(n[0]), short(n[1]))) |
950 if n[0] == nullid: | 965 if n[0] == nullid: # found the end of the branch |
951 break | 966 pass |
952 if n in seenbranch: | 967 elif n in seenbranch: |
953 self.ui.debug(_("branch already found\n")) | 968 self.ui.debug(_("branch already found\n")) |
954 continue | 969 continue |
955 if n[1] and n[1] in m: # do we know the base? | 970 elif n[1] and n[1] in m: # do we know the base? |
956 self.ui.debug(_("found incomplete branch %s:%s\n") | 971 self.ui.debug(_("found incomplete branch %s:%s\n") |
957 % (short(n[0]), short(n[1]))) | 972 % (short(n[0]), short(n[1]))) |
958 search.append(n) # schedule branch range for scanning | 973 search.append(n) # schedule branch range for scanning |
959 seenbranch[n] = 1 | 974 seenbranch[n] = 1 |
960 else: | 975 else: |
961 if n[1] not in seen and n[1] not in fetch: | 976 if n[1] not in seen and n[1] not in fetch: |
962 if n[2] in m and n[3] in m: | 977 if n[2] in m and n[3] in m: |
963 self.ui.debug(_("found new changeset %s\n") % | 978 self.ui.debug(_("found new changeset %s\n") % |
964 short(n[1])) | 979 short(n[1])) |
965 fetch[n[1]] = 1 # earliest unknown | 980 fetch[n[1]] = 1 # earliest unknown |
966 base[n[2]] = 1 # latest known | 981 for p in n[2:4]: |
967 continue | 982 if p in m: |
968 | 983 base[p] = 1 # latest known |
969 for a in n[2:4]: | 984 |
970 if a not in rep: | 985 for p in n[2:4]: |
971 r.append(a) | 986 if p not in req and p not in m: |
972 rep[a] = 1 | 987 r.append(p) |
973 | 988 req[p] = 1 |
974 seen[n[0]] = 1 | 989 seen[n[0]] = 1 |
975 | 990 |
976 if r: | 991 if r: |
977 reqcnt += 1 | 992 reqcnt += 1 |
978 self.ui.debug(_("request %d: %s\n") % | 993 self.ui.debug(_("request %d: %s\n") % |
979 (reqcnt, " ".join(map(short, r)))) | 994 (reqcnt, " ".join(map(short, r)))) |
980 for p in range(0, len(r), 10): | 995 for p in range(0, len(r), 10): |
981 for b in remote.branches(r[p:p+10]): | 996 for b in remote.branches(r[p:p+10]): |
982 self.ui.debug(_("received %s:%s\n") % | 997 self.ui.debug(_("received %s:%s\n") % |
983 (short(b[0]), short(b[1]))) | 998 (short(b[0]), short(b[1]))) |
984 if b[0] in m: | 999 unknown.append(b) |
985 self.ui.debug(_("found base node %s\n") | |
986 % short(b[0])) | |
987 base[b[0]] = 1 | |
988 elif b[0] not in seen: | |
989 unknown.append(b) | |
990 | 1000 |
991 # do binary search on the branches we found | 1001 # do binary search on the branches we found |
992 while search: | 1002 while search: |
993 n = search.pop(0) | 1003 n = search.pop(0) |
994 reqcnt += 1 | 1004 reqcnt += 1 |