Showing
8 changed files
with
129 additions
and
29 deletions
File moved
... | @@ -12,23 +12,40 @@ | ... | @@ -12,23 +12,40 @@ |
12 | # See the License for the specific language governing permissions and | 12 | # See the License for the specific language governing permissions and |
13 | # limitations under the License. | 13 | # limitations under the License. |
14 | 14 | ||
15 | +import click | ||
15 | import json | 16 | import json |
16 | import requests | 17 | import requests |
17 | -import argparse | ||
18 | import subprocess | 18 | import subprocess |
19 | +import configparser | ||
19 | import whatthepatch | 20 | import whatthepatch |
21 | +from os.path import expanduser, join, exists | ||
22 | + | ||
23 | +def get_diff_from_project(): | ||
24 | + proc = subprocess.Popen(["git", "diff", "--cached"], stdout=subprocess.PIPE) | ||
25 | + staged_files = proc.stdout.readlines() | ||
26 | + staged_files = [f.decode("utf-8") for f in staged_files] | ||
27 | + return staged_files | ||
28 | + | ||
29 | +def commit_message_parser(messages, endline=1): | ||
30 | + message = "" | ||
31 | + for idx, (path, commit) in enumerate(messages.items()): | ||
32 | + click.echo(" - " + " ".join(commit["message"])) | ||
33 | + message += " ".join(commit["message"]) | ||
34 | + if len(messages) - 1 != idx: | ||
35 | + message += ("\n" * endline) | ||
36 | + return message | ||
20 | 37 | ||
21 | def tokenizing(code): | 38 | def tokenizing(code): |
22 | data = {"code": code } | 39 | data = {"code": code } |
23 | res = requests.post( | 40 | res = requests.post( |
24 | 'http://127.0.0.1:5000/tokenizer', | 41 | 'http://127.0.0.1:5000/tokenizer', |
25 | data=json.dumps(data), | 42 | data=json.dumps(data), |
26 | - headers=args.headers | 43 | + headers={'Content-Type': 'application/json; charset=utf-8'} |
27 | ) | 44 | ) |
28 | return json.loads(res.text)["tokens"] | 45 | return json.loads(res.text)["tokens"] |
29 | 46 | ||
30 | -def autosuggestions(diffs): | 47 | +def commit_autosuggestions(diffs): |
31 | - commit_message = [] | 48 | + commit_message = {} |
32 | for idx, example in enumerate(whatthepatch.parse_patch(diffs)): | 49 | for idx, example in enumerate(whatthepatch.parse_patch(diffs)): |
33 | if not example.changes: | 50 | if not example.changes: |
34 | continue | 51 | continue |
... | @@ -43,44 +60,78 @@ def autosuggestions(diffs): | ... | @@ -43,44 +60,78 @@ def autosuggestions(diffs): |
43 | deleted.extend(tokenizing(change.line)) | 60 | deleted.extend(tokenizing(change.line)) |
44 | isdeleted = True | 61 | isdeleted = True |
45 | 62 | ||
46 | - if isadded and isdeleted: | 63 | + if isadded and isdeleted and example.header.new_path: |
47 | data = {"idx": idx, "added" : added, "deleted" : deleted} | 64 | data = {"idx": idx, "added" : added, "deleted" : deleted} |
48 | res = requests.post( | 65 | res = requests.post( |
49 | 'http://127.0.0.1:5000/diff', | 66 | 'http://127.0.0.1:5000/diff', |
50 | data=json.dumps(data), | 67 | data=json.dumps(data), |
51 | - headers=args.headers | 68 | + headers={'Content-Type': 'application/json; charset=utf-8'} |
52 | ) | 69 | ) |
53 | commit = json.loads(res.text) | 70 | commit = json.loads(res.text) |
54 | - commit.update({'path' : example.header.new_path}) | 71 | + commit_message[example.header.new_path] = commit |
55 | - commit_message.append(commit) | ||
56 | else: | 72 | else: |
57 | data = {"idx": idx, "added": added, "deleted": deleted} | 73 | data = {"idx": idx, "added": added, "deleted": deleted} |
58 | res = requests.post( | 74 | res = requests.post( |
59 | 'http://127.0.0.1:5000/added', | 75 | 'http://127.0.0.1:5000/added', |
60 | data=json.dumps(data), | 76 | data=json.dumps(data), |
61 | - headers=args.headers | 77 | + headers={'Content-Type': 'application/json; charset=utf-8'} |
62 | ) | 78 | ) |
63 | commit = json.loads(res.text) | 79 | commit = json.loads(res.text) |
64 | - commit.update({'path': example.header.new_path}) | 80 | + commit_message[example.header.new_path] = commit |
65 | - commit_message.append(commit) | ||
66 | return commit_message | 81 | return commit_message |
67 | 82 | ||
68 | -def main(): | 83 | +def commit(message): |
84 | + subprocess.Popen(["git", "commit", "-m", message], stdout=subprocess.PIPE) | ||
69 | 85 | ||
70 | - proc = subprocess.Popen(["git", "diff", "--cached"], stdout=subprocess.PIPE) | 86 | +@click.group(invoke_without_command=True) |
71 | - staged_files = proc.stdout.readlines() | 87 | +@click.pass_context |
72 | - staged_files = [f.decode("utf-8") for f in staged_files] | 88 | +@click.option('--file', '-f', type=click.File('r'), |
73 | - staged_files = [f.strip() for f in staged_files] | 89 | + help='patch file containing git diff ' |
74 | - diffs = "\n".join(staged_files) | 90 | + '(e.g. file created by `git add` and `git diff --cached > test.diff`)') |
91 | +@click.option('--verbose', '-v', is_flag=True, | ||
92 | + help='print suggested commit message more detail.') | ||
93 | +@click.option('--autocommit', '-a', is_flag=True, | ||
94 | + help='automatically commit without asking if you want to commit') | ||
95 | +@click.option('--endline', '-e', type=int, default=1, | ||
96 | + help='number of endlines for each commit message generated by the diff of each file') | ||
97 | +def cli(ctx, file, verbose, autocommit, endline): | ||
98 | + if not ctx.invoked_subcommand: | ||
99 | + staged_files = file if file else get_diff_from_project() | ||
100 | + staged_files = [f.strip() for f in staged_files] | ||
101 | + diffs = "\n".join(staged_files) | ||
75 | 102 | ||
76 | - message = autosuggestions(diffs=diffs) | 103 | + messages = commit_autosuggestions(diffs=diffs) |
77 | - print(message) | 104 | + if verbose: |
105 | + click.echo( | ||
106 | + json.dumps(messages, indent=4, sort_keys=True) + "\n" | ||
107 | + ) | ||
108 | + | ||
109 | + click.echo(click.style('[INFO]', fg='green') + " The generated message is as follows:") | ||
110 | + message = commit_message_parser(messages, endline=endline) | ||
111 | + | ||
112 | + if autocommit or click.confirm('Do you want to commit this message?'): | ||
113 | + commit(message) | ||
78 | 114 | ||
79 | -if __name__ == '__main__': | ||
80 | - parser = argparse.ArgumentParser(description="") | ||
81 | - parser.add_argument("--endpoint", type=str, default="http://127.0.0.1:5000/") | ||
82 | - args = parser.parse_args() | ||
83 | 115 | ||
84 | - args.headers = {'Content-Type': 'application/json; charset=utf-8'} | 116 | +@cli.command() |
117 | +@click.option('--profile', default='default', type=str, | ||
118 | + help='unique name for managing each independent settings') | ||
119 | +@click.option('--endpoint', default='http://127.0.0.1:5000/', type=str, | ||
120 | + help='endpoint address accessible to the server (example:http://127.0.0.1:5000/)') | ||
85 | 121 | ||
86 | - main() | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
122 | +def configure(profile, endpoint): | ||
123 | + path = join(expanduser("~"), '.commit-autosuggestions.ini') | ||
124 | + config = configparser.ConfigParser() | ||
125 | + if exists(path): | ||
126 | + config.read(path) | ||
127 | + if profile not in config: | ||
128 | + config[profile] = {} | ||
129 | + if endpoint: | ||
130 | + config[profile]['endpoint'] = endpoint | ||
131 | + | ||
132 | + click.echo(f"configure of commit-autosuggestions is setted up in {path}.") | ||
133 | + for key in config[profile]: | ||
134 | + click.echo(click.style(key, fg='green') + config[profile][key]) | ||
135 | + | ||
136 | +if __name__ == '__main__': | ||
137 | + cli() | ||
... | \ No newline at end of file | ... | \ No newline at end of file | ... | ... |
... | @@ -13,10 +13,10 @@ | ... | @@ -13,10 +13,10 @@ |
13 | # limitations under the License. | 13 | # limitations under the License. |
14 | 14 | ||
15 | import os | 15 | import os |
16 | -from setuptools import setup | 16 | +from setuptools import setup, find_packages |
17 | 17 | ||
18 | project_name = "commit" | 18 | project_name = "commit" |
19 | -version = os.environ.get('COMMIT_VERSION', '0.0.0') | 19 | +version = os.environ.get('COMMIT_VERSION', '0.0.1') |
20 | 20 | ||
21 | if __name__ == "__main__": | 21 | if __name__ == "__main__": |
22 | 22 | ||
... | @@ -41,9 +41,16 @@ if __name__ == "__main__": | ... | @@ -41,9 +41,16 @@ if __name__ == "__main__": |
41 | project_urls={ | 41 | project_urls={ |
42 | "Source Code": "https://github.com/graykode/commit-autosuggestions", | 42 | "Source Code": "https://github.com/graykode/commit-autosuggestions", |
43 | }, | 43 | }, |
44 | + install_requires = [ | ||
45 | + 'click>=7.1.2', | ||
46 | + 'gitpython>=3.1.7', | ||
47 | + 'whatthepatch>=1.0.0', | ||
48 | + 'packaging>=20.4', | ||
49 | + ], | ||
44 | entry_points={ | 50 | entry_points={ |
45 | 'console_scripts': [ | 51 | 'console_scripts': [ |
46 | - 'commit=commit.__main__:main', | 52 | + 'commit=commit.commit:cli' |
47 | ], | 53 | ], |
48 | - } | 54 | + }, |
55 | + packages=find_packages(), | ||
49 | ) | 56 | ) |
... | \ No newline at end of file | ... | \ No newline at end of file | ... | ... |
File moved
File moved
tests/mixed.diff
0 → 100644
1 | +diff --git a/codebert/code.py b/codebert/code.py | ||
2 | +new file mode 100644 | ||
3 | +index 0000000..b4bc953 | ||
4 | +--- /dev/null | ||
5 | ++++ b/codebert/code.py | ||
6 | +@@ -0,0 +1,21 @@ | ||
7 | ++def dailymotion_download(url, output_dir='.', merge=True, info_only=False, **kwargs): | ||
8 | ++ | ||
9 | ++ html = get_content(rebuilt_url(url)) | ||
10 | ++ info = json.loads(match1(html, r'qualities":({.+?}),"')) | ||
11 | ++ title = match1(html, r'"video_title"\s*:\s*"([^"]+)"') or \ | ||
12 | ++ match1(html, r'"title"\s*:\s*"([^"]+)"') | ||
13 | ++ title = unicodize(title) | ||
14 | ++ | ||
15 | ++ for quality in ['1080','720','480','380','240','144','auto']: | ||
16 | ++ try: | ||
17 | ++ real_url = info[quality][1]["url"] | ||
18 | ++ if real_url: | ||
19 | ++ break | ||
20 | ++ except KeyError: | ||
21 | ++ pass | ||
22 | ++ | ||
23 | ++ mime, ext, size = url_info(real_url) | ||
24 | ++ | ||
25 | ++ print_info(site_info, title, mime, size) | ||
26 | ++ if not info_only: | ||
27 | ++ download_urls([real_url], title, ext, size, output_dir=output_dir, merge=merge) | ||
28 | +diff --git a/src/train/model.py b/src/train/model.py | ||
29 | +index 20e56b3..cab82e5 100644 | ||
30 | +--- a/src/train/model.py | ||
31 | ++++ b/src/train/model.py | ||
32 | +@@ -3,9 +3,7 @@ | ||
33 | + | ||
34 | + import torch | ||
35 | + import torch.nn as nn | ||
36 | +-import torch | ||
37 | +-from torch.autograd import Variable | ||
38 | +-import copy | ||
39 | ++ | ||
40 | + class Seq2Seq(nn.Module): | ||
41 | + """ | ||
42 | + Build Seqence-to-Sequence. | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
File moved
-
Please register or login to post a comment