Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(725)

Side by Side Diff: client/libs/ar/writer.py

Issue 2049523004: luci-py: Tools for working with BSD style ar archives. (Closed) Base URL: https://github.com/luci/luci-py.git@master
Patch Set: Removing the hashbang line. Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« client/libs/ar/reader.py ('K') | « client/libs/ar/reader.py ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 # Copyright 2016 The LUCI Authors. All rights reserved.
2 # Use of this source code is governed under the Apache License, Version 2.0
3 # that can be found in the LICENSE file.
4
5 import shutil
6
7
8 class ArWriter(object):
9 """Write an ar archive to the given output buffer."""
10
11 # Mode sentinels
12 MODE_HEADER = []
13 MODE_CONTENTS = []
14
15 def __init__(self, obuf):
16 self.obuf = obuf
17 self.obuf.write("!<arch>\n")
18 self.mode = ArWriter.MODE_HEADER
19 self.needspadding = False
20 self.bytesrequired = 0
21
22 def header(self, fp, size, modtime, ownerid, groupid, filemod):
23 """Write a file information to the archive."""
24 assert self.mode == ArWriter.MODE_HEADER
25 assert self.bytesrequired == 0
26
27 # File name, 16 bytes
28 self.obuf.write("#1/%-13s" % str(len(fp)))
M-A Ruel 2016/06/09 21:50:44 single quotes everywhere
mithro 2016/06/14 12:15:55 Done.
29 # Modtime, 12 bytes
30 self.obuf.write("%-12i" % modtime)
31 # Owner ID, 6 bytes
32 self.obuf.write("%-6i" % ownerid)
33 # Group ID, 6 bytes
34 self.obuf.write("%-6i" % groupid)
35 # File mode, 8 bytes
36 self.obuf.write("%-8o" % filemod)
37
38 datasize = size+len(fp)
39 # File size, 10 bytes
40 self.obuf.write("%-10s" % datasize)
41 # File magic, 2 bytes
42 self.obuf.write("\x60\n")
43
44 # Filename - BSD variant
45 self.obuf.write(fp)
46
47 self.mode = ArWriter.MODE_CONTENTS
48 self.bytesrequired = size
49 self.needspadding = datasize % 2 != 0
50
51 def _write(self, ibuf=None, s=None):
52 assert self.mode == ArWriter.MODE_CONTENTS
53 assert ibuf is not None or s is not None
54
55 if ibuf is not None:
56 start = ibuf.tell()
57 shutil.copyfileobj(ibuf, self.obuf)
58 end = ibuf.tell()
59 self.bytesrequired -= end-start
60
61 if s is not None:
62 self.obuf.write(s)
63 self.bytesrequired -= len(s)
64
65 if self.bytesrequired == 0:
66 if self.needspadding:
67 self.obuf.write("\n")
68 self.mode = ArWriter.MODE_HEADER
69
70 def write(self, ibuf_or_str):
71 """Write the file body to the archive."""
72 try:
73 self._write(ibuf=ibuf_or_str)
74 except AttributeError:
M-A Ruel 2016/06/09 21:50:44 ?
mithro 2016/06/14 12:15:55 Rather than trying to check if ibuf_or_str will wo
75 self._write(s=ibuf_or_str)
76
77 def close(self):
78 """Close the archive. Will close the output buffer."""
79 assert self.bytesrequired == 0
80 assert self.mode == ArWriter.MODE_HEADER
81 self.obuf.close()
82
83
84 class ArDefaultWriter(ArWriter):
85 """Write an ar archive using defaults to the given output buffer.
86
87 Only a file's name and content are needed to create the archive, all of the
88 modification time, user, group and mode information will be set to default
89 values. This means that you don't need to perform an expensive stat the file.
90 """
91 DEFAULT_MODTIME = 1447140471
92 DEFAULT_USER = 1000
93 DEFAULT_GROUP = 1000
94 DEFAULT_MODE = 0100640 # 100640 -- Octal
95
96 def header(self, name, size,
97 modtime=None, ownerid=None, groupid=None, filemod=None):
98 assert modtime is None
99 assert ownerid is None
100 assert groupid is None
101 assert filemod is None
102 ArWriter.header(
103 self, name, size,
104 self.DEFAULT_MODTIME, self.DEFAULT_USER, self.DEFAULT_GROUP,
105 self.DEFAULT_MODE)
106
107 def add(self, name, data):
108 self.header(name, len(data))
109 self._write(s=data)
OLDNEW
« client/libs/ar/reader.py ('K') | « client/libs/ar/reader.py ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698