equal
deleted
inserted
replaced
11 import glob |
11 import glob |
12 import hashlib |
12 import hashlib |
13 import os |
13 import os |
14 import re |
14 import re |
15 import socket |
15 import socket |
|
16 import subprocess |
16 import weakref |
17 import weakref |
17 |
18 |
18 from .i18n import _ |
19 from .i18n import _ |
19 from .node import ( |
20 from .node import ( |
20 hex, |
21 hex, |
1036 spec = repo.ui.config("extdata", source) |
1037 spec = repo.ui.config("extdata", source) |
1037 if not spec: |
1038 if not spec: |
1038 raise error.Abort(_("unknown extdata source '%s'") % source) |
1039 raise error.Abort(_("unknown extdata source '%s'") % source) |
1039 |
1040 |
1040 data = {} |
1041 data = {} |
1041 if spec.startswith("shell:"): |
1042 src = proc = None |
1042 # external commands should be run relative to the repo root |
|
1043 cmd = spec[6:] |
|
1044 cwd = os.getcwd() |
|
1045 os.chdir(repo.root) |
|
1046 try: |
|
1047 src = util.popen(cmd) |
|
1048 finally: |
|
1049 os.chdir(cwd) |
|
1050 else: |
|
1051 # treat as a URL or file |
|
1052 src = url.open(repo.ui, spec) |
|
1053 |
|
1054 try: |
1043 try: |
|
1044 if spec.startswith("shell:"): |
|
1045 # external commands should be run relative to the repo root |
|
1046 cmd = spec[6:] |
|
1047 proc = subprocess.Popen(cmd, shell=True, bufsize=-1, |
|
1048 close_fds=util.closefds, |
|
1049 stdout=subprocess.PIPE, cwd=repo.root) |
|
1050 src = proc.stdout |
|
1051 else: |
|
1052 # treat as a URL or file |
|
1053 src = url.open(repo.ui, spec) |
1055 for l in src: |
1054 for l in src: |
1056 if " " in l: |
1055 if " " in l: |
1057 k, v = l.strip().split(" ", 1) |
1056 k, v = l.strip().split(" ", 1) |
1058 else: |
1057 else: |
1059 k, v = l.strip(), "" |
1058 k, v = l.strip(), "" |
1062 try: |
1061 try: |
1063 data[repo[k].rev()] = encoding.tolocal(v) |
1062 data[repo[k].rev()] = encoding.tolocal(v) |
1064 except (error.LookupError, error.RepoLookupError): |
1063 except (error.LookupError, error.RepoLookupError): |
1065 pass # we ignore data for nodes that don't exist locally |
1064 pass # we ignore data for nodes that don't exist locally |
1066 finally: |
1065 finally: |
1067 src.close() |
1066 if proc: |
|
1067 proc.communicate() |
|
1068 if src: |
|
1069 src.close() |
1068 |
1070 |
1069 return data |
1071 return data |
1070 |
1072 |
1071 def _locksub(repo, lock, envvar, cmd, environ=None, *args, **kwargs): |
1073 def _locksub(repo, lock, envvar, cmd, environ=None, *args, **kwargs): |
1072 if lock is None: |
1074 if lock is None: |