Hide keyboard shortcuts

Hot-keys on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

#pylint: disable=wrong-import-position,wrong-import-order,superfluous-parens 

import os 

import argparse 

import sys 

import traceback 

import errno 

import tqdm 

import dxf 

import dxf.exceptions 

import requests.exceptions 

 

_choices = ['auth', 

'push-blob', 

'pull-blob', 

'blob-size', 

'del-blob', 

'set-alias', 

'get-alias', 

'del-alias', 

'get-digest', 

'list-aliases', 

'list-repos'] 

 

_parser = argparse.ArgumentParser() 

_subparsers = _parser.add_subparsers(dest='op') 

for c in _choices: 

sp = _subparsers.add_parser(c) 

if c != 'list-repos': 

sp.add_argument("repo") 

sp.add_argument('args', nargs='*') 

 

def _flatten(l): 

return [item for sublist in l for item in sublist] 

 

# pylint: disable=too-many-statements 

def doit(args, environ): 

dxf_progress = environ.get('DXF_PROGRESS') 

if dxf_progress == '1' or (dxf_progress != '0' and sys.stderr.isatty()): 

bars = {} 

def progress(dgst, chunk, size): 

if dgst not in bars: 

bars[dgst] = tqdm.tqdm(desc=dgst[0:8], 

total=size, 

leave=True) 

if chunk: 

bars[dgst].update(len(chunk)) 

if bars[dgst].n >= bars[dgst].total: 

bars[dgst].close() 

del bars[dgst] 

else: 

progress = None 

 

dxf_skiptlsverify = environ.get('DXF_SKIPTLSVERIFY') 

if dxf_skiptlsverify == '1': 

dxf_tlsverify = False 

else: 

dxf_tlsverify = environ.get('DXF_TLSVERIFY', True) 

 

def auth(dxf_obj, response): 

# pylint: disable=redefined-outer-name 

username = environ.get('DXF_USERNAME') 

password = environ.get('DXF_PASSWORD') 

authorization = environ.get('DXF_AUTHORIZATION') 

dxf_obj.authenticate(username, password, 

response=response, 

authorization=authorization) 

 

args = _parser.parse_args(args) 

if args.op != 'list-repos': 

dxf_obj = dxf.DXF(environ['DXF_HOST'], 

args.repo, 

auth, 

environ.get('DXF_INSECURE') == '1', 

environ.get('DXF_AUTH_HOST'), 

tlsverify=dxf_tlsverify) 

else: 

dxf_obj = dxf.DXFBase(environ['DXF_HOST'], 

auth, 

environ.get('DXF_INSECURE') == '1', 

environ.get('DXF_AUTH_HOST'), 

tlsverify=dxf_tlsverify) 

 

def _doit(): 

# pylint: disable=too-many-branches 

if args.op == "auth": 

username = environ.get('DXF_USERNAME') 

password = environ.get('DXF_PASSWORD') 

authorization = environ.get('DXF_AUTHORIZATION') 

token = dxf_obj.authenticate(username, password, 

actions=args.args, 

authorization=authorization) 

if token: 

print(token) 

return 

 

token = environ.get('DXF_TOKEN') 

if token: 

dxf_obj.token = token 

 

if args.op == "push-blob": 

if len(args.args) < 1: 

_parser.error('too few arguments') 

if len(args.args) > 2: 

_parser.error('too many arguments') 

if len(args.args) == 2 and not args.args[1].startswith('@'): 

_parser.error('invalid alias') 

dgst = dxf_obj.push_blob(args.args[0], progress) 

if len(args.args) == 2: 

dxf_obj.set_alias(args.args[1][1:], dgst) 

print(dgst) 

 

elif args.op == "pull-blob": 

_stdout = getattr(sys.stdout, 'buffer', sys.stdout) 

if args.args: 

dgsts = _flatten([dxf_obj.get_alias(name[1:]) 

if name.startswith('@') else [name] 

for name in args.args]) 

else: 

dgsts = dxf_obj.get_alias(manifest=sys.stdin.read()) 

for dgst in dgsts: 

it, size = dxf_obj.pull_blob( 

dgst, size=True, chunk_size=environ.get('DXF_CHUNK_SIZE')) 

if environ.get('DXF_BLOB_INFO') == '1': 

print(dgst + ' ' + str(size)) 

if progress: 

progress(dgst, b'', size) 

for chunk in it: 

if progress: 

progress(dgst, chunk, size) 

_stdout.write(chunk) 

 

elif args.op == 'blob-size': 

if args.args: 

sizes = [dxf_obj.get_alias(name[1:], sizes=True) 

if name.startswith('@') else 

[(name, dxf_obj.blob_size(name))] 

for name in args.args] 

else: 

sizes = [dxf_obj.get_alias(manifest=sys.stdin.read(), 

sizes=True)] 

for tuples in sizes: 

print(sum([size for _, size in tuples])) 

 

elif args.op == 'del-blob': 

if args.args: 

dgsts = _flatten([dxf_obj.del_alias(name[1:]) 

if name.startswith('@') else [name] 

for name in args.args]) 

else: 

dgsts = dxf_obj.get_alias(manifest=sys.stdin.read()) 

for dgst in dgsts: 

dxf_obj.del_blob(dgst) 

 

elif args.op == "set-alias": 

if len(args.args) < 2: 

_parser.error('too few arguments') 

dgsts = [dxf.hash_file(dgst) if os.sep in dgst else dgst 

for dgst in args.args[1:]] 

sys.stdout.write(dxf_obj.set_alias(args.args[0], *dgsts)) 

 

elif args.op == "get-alias": 

if args.args: 

dgsts = _flatten([dxf_obj.get_alias(name) for name in args.args]) 

else: 

dgsts = dxf_obj.get_alias(manifest=sys.stdin.read()) 

for dgst in dgsts: 

print(dgst) 

 

elif args.op == "del-alias": 

for name in args.args: 

for dgst in dxf_obj.del_alias(name): 

print(dgst) 

 

elif args.op == 'get-digest': 

175 ↛ 178line 175 didn't jump to line 178, because the condition on line 175 was never false if args.args: 

dgsts = [dxf_obj.get_digest(name) for name in args.args] 

else: 

dgsts = [dxf_obj.get_digest(manifest=sys.stdin.read())] 

for dgst in dgsts: 

print(dgst) 

 

elif args.op == 'list-aliases': 

if args.args: 

_parser.error('too many arguments') 

for name in dxf_obj.list_aliases(iterate=True): 

print(name) 

 

188 ↛ exitline 188 didn't return from function '_doit', because the condition on line 188 was never false elif args.op == 'list-repos': 

for name in dxf_obj.list_repos(iterate=True): 

print(name) 

 

try: 

_doit() 

return 0 

except dxf.exceptions.DXFUnauthorizedError: 

traceback.print_exc() 

return errno.EACCES 

except requests.exceptions.HTTPError as ex: 

# pylint: disable=no-member 

if ex.response.status_code == requests.codes.not_found: 

traceback.print_exc() 

return errno.ENOENT 

raise 

 

def main(): 

exit(doit(sys.argv[1:], os.environ))