forked from jacek-marchwicki/JavaWebsocketClient
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathclose-task.py
More file actions
154 lines (119 loc) · 5.01 KB
/
close-task.py
File metadata and controls
154 lines (119 loc) · 5.01 KB
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
#!/usr/bin/env python
#
# Copyright 2014 Jacek Marchwicki <[email protected]>
import subprocess
import re
import unittest
import argparse
import sys
import urllib2
import json
def main():
parser = argparse.ArgumentParser(description='Manage task.')
parser.add_argument('--token', dest='token', required=True, nargs='?',
type=str, help='token')
parser.add_argument('--merge', dest='merge', action='store_const',
const=True, default=False, help='task is merged')
parser.add_argument('--base-url', dest='base_url', nargs="?",
type=str, help='base url', default="https://auto-close.appspot.com/")
parser.add_argument('message', metavar='MESSAGE', type=str, nargs=1,
help='an message added to task')
args = parser.parse_args()
message = args.message[0]
commit_message = get_commit_message_lines()
closed_urls = get_urls(commit_message, lambda line: get_url_by_keyword("Closes", line))
referred_urls = get_urls(commit_message, lambda line: get_url_by_keyword("Refers", line))
if "[wip]" in commit_message[0].lower():
write_message(args.base_url, referred_urls, args.token, "Referred in [WIP] commit: " + message)
write_message(args.base_url, closed_urls, args.token, "[WIP] commit pushed to review: " + message)
elif args.merge:
write_message(args.base_url, referred_urls, args.token, "Referred commit merged: " + message)
close_urls(args.base_url, closed_urls, args.token, "Commit merged in review: " + message)
else:
write_message(args.base_url, referred_urls, args.token, "Referred in commit: " + message)
review_urls(args.base_url, closed_urls, args.token, "Commit pushed to review: " + message)
handler = urllib2.HTTPSHandler(debuglevel=0)
opener = urllib2.build_opener(handler)
def write_message(base_url, urls, token, message):
for url in urls:
data = {
"message": message,
"token": token,
"url": url
}
execute(base_url, data)
def close_urls(base_url, urls, token, message):
for url in urls:
data = {
"message": message,
"close": "true",
"token": token,
"url": url
}
execute(base_url, data)
def review_urls(base_url, urls, token, message):
for url in urls:
data = {
"message": message,
"review": "true",
"token": token,
"url": url
}
execute(base_url, data)
def execute(base_url, data):
headers = {
"Content-Type": "application/json"
}
request = urllib2.Request("%sclose" % base_url, json.dumps(data), headers)
try:
response = opener.open(request)
return json.loads(response.read())
except urllib2.HTTPError as e:
print >> sys.stderr, "Response from server: %s" % e.read()
raise e
def get_commit_message_lines():
commit_message = subprocess.check_output(["git", "log", "-1", "--pretty=%B"]).splitlines()
commit_message = [i.strip() for i in commit_message]
return commit_message
def get_urls(commit_message, f):
urls = []
for commit_line in commit_message:
url = f(commit_line)
if url:
urls.append(url)
return urls
def do_work():
commit_message = get_commit_message_lines()
closed_urls = get_urls(commit_message, lambda line: get_url_by_keyword("Closes", line))
refered_urls = get_urls(commit_message, lambda line: get_url_by_keyword("Refer", line))
print closed_urls
print refered_urls
def get_url_by_keyword(keyword, line):
match = re.match("^%s:? ([\w:\/\.-]+)$" % keyword, line)
if not match:
return None
return match.group(1)
class TestGetLinkMethod(unittest.TestCase):
"""
Run unit tests: python -m unittest close-task
"""
def test_valid_url(self):
self.assertEqual(
get_url_by_keyword("Closes", "Closes https://appunite.dobambam.com/project/100125/tasks/t2038"),
'https://appunite.dobambam.com/project/100125/tasks/t2038')
def test_refer_url(self):
self.assertEqual(get_url_by_keyword("Refer", "Refer https://appunite.dobambam.com/project/100125/tasks/t2038"),
'https://appunite.dobambam.com/project/100125/tasks/t2038')
def test_valid_close_with_semicolon(self):
self.assertEqual(
get_url_by_keyword("Closes", "Closes: https://appunite.dobambam.com/project/100125/tasks/t2038"),
'https://appunite.dobambam.com/project/100125/tasks/t2038')
def test_invalid_close_after_some_char(self):
self.assertIsNone(
get_url_by_keyword("Closes", "xCloses: https://appunite.dobambam.com/project/100125/tasks/t2038"))
def test_invalid_url(self):
self.assertIsNone(
get_url_by_keyword("Closes", "Closes: https://appunite.dobambam.com/project/100125/tasks/t2038[]"))
if __name__ == '__main__':
main()