-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathqueue.py
executable file
·103 lines (84 loc) · 2.55 KB
/
queue.py
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
#!/usr/bin/env python
import sys
import cPickle
import subprocess
import os.path
class QueueError(Exception):
pass
class Queue(object):
def __init__(self, *args):
self.queue = []
for arg in args:
self.put(arg)
def put(self, element):
self.queue.insert(0, element)
def remove(self, element):
try:
self.queue.remove(element)
except ValueError:
raise QueueError("Could not find element {0}!".format(element))
def next(self):
try:
return self.queue.pop()
except IndexError:
raise QueueError("Empty queue!")
def to_list(self):
return [self.next() for i in range(len(self))]
def __str__(self):
return repr(self.queue)
def __len__(self):
return len(self.queue)
def exit(status):
if os.path.isfile(".queue-lock"):
subprocess.call(["rm", ".queue-lock"])
sys.exit(status)
if __name__ == "__main__":
while os.path.isfile(".queue-lock"):
pass
subprocess.call(["touch", ".queue-lock"])
try:
main, pending = cPickle.load(open(".queue_data"))
except: # failed somehow to open and de-serialize the data.
# could be practically any exception, so it is a bare 'except: '
main = Queue()
pending = Queue()
sys.argv.pop(0) # remove the useless './queue.py' part
argc = len(sys.argv)
if argc == 0:
exit(1)
elif sys.argv[0] == "add":
if argc == 1:
exit(1)
else:
for item in sys.argv[1:]:
main.put(item)
elif sys.argv[0] == "next":
try:
next_key = main.next()
pending.put(next_key)
print "{0}".format(next_key)
except QueueError:
exit(1)
elif sys.argv[0] == "reset":
if len(pending) < 1:
exit(1)
else:
main = Queue(*(pending.to_list() + main.to_list()))
elif sys.argv[0] == "done":
if argc == 1:
pending.next() # it gets thrown away, so essentially removing
else:
for item in sys.argv[1:]:
try:
pending.remove(item)
except QueueError:
pass
elif sys.argv[0] == "print":
print ", ".join(main.queue)
print ", ".join(pending.queue)
elif sys.argv[0] == "clear":
main = Queue()
outfd = open(".queue_data", "w")
cPickle.dump([main, pending], outfd)
outfd.close()
exit(0)