annotate sync.py @ 15:d653e1b558ce

rm dead code; reformat
author drewp@bigasterisk.com <drewp@bigasterisk.com>
date Sat, 17 Jul 2021 00:17:56 -0700
parents f83b7426b97c
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
15
d653e1b558ce rm dead code; reformat
drewp@bigasterisk.com <drewp@bigasterisk.com>
parents: 14
diff changeset
1 import json
d653e1b558ce rm dead code; reformat
drewp@bigasterisk.com <drewp@bigasterisk.com>
parents: 14
diff changeset
2 import logging
d653e1b558ce rm dead code; reformat
drewp@bigasterisk.com <drewp@bigasterisk.com>
parents: 14
diff changeset
3 import os
d653e1b558ce rm dead code; reformat
drewp@bigasterisk.com <drewp@bigasterisk.com>
parents: 14
diff changeset
4 import re
d653e1b558ce rm dead code; reformat
drewp@bigasterisk.com <drewp@bigasterisk.com>
parents: 14
diff changeset
5 import subprocess
d653e1b558ce rm dead code; reformat
drewp@bigasterisk.com <drewp@bigasterisk.com>
parents: 14
diff changeset
6 from pathlib import Path
0
drewp@bigasterisk.com
parents:
diff changeset
7
1
1da34eecdfd8 port to PyGithub so repo creates work again
drewp@bigasterisk.com
parents: 0
diff changeset
8 from github import Github, GithubException
15
d653e1b558ce rm dead code; reformat
drewp@bigasterisk.com <drewp@bigasterisk.com>
parents: 14
diff changeset
9
0
drewp@bigasterisk.com
parents:
diff changeset
10 logging.basicConfig(level=logging.INFO)
drewp@bigasterisk.com
parents:
diff changeset
11 log = logging.getLogger()
drewp@bigasterisk.com
parents:
diff changeset
12
9
2c4d383d464c move config stuff into Project
drewp@bigasterisk.com
parents: 8
diff changeset
13
2c4d383d464c move config stuff into Project
drewp@bigasterisk.com
parents: 8
diff changeset
14 class Project:
15
d653e1b558ce rm dead code; reformat
drewp@bigasterisk.com <drewp@bigasterisk.com>
parents: 14
diff changeset
15
9
2c4d383d464c move config stuff into Project
drewp@bigasterisk.com
parents: 8
diff changeset
16 def __init__(self, projRoot: Path):
15
d653e1b558ce rm dead code; reformat
drewp@bigasterisk.com <drewp@bigasterisk.com>
parents: 14
diff changeset
17 # from https://docs.github.com/en/developers/apps/building-oauth-apps/authorizing-oauth-apps#non-web-application-flow
d653e1b558ce rm dead code; reformat
drewp@bigasterisk.com <drewp@bigasterisk.com>
parents: 14
diff changeset
18 # -> https://github.com/settings/tokens to make one
9
2c4d383d464c move config stuff into Project
drewp@bigasterisk.com
parents: 8
diff changeset
19 self.config = json.load(open(Path(__file__).parent / "config.json"))
2c4d383d464c move config stuff into Project
drewp@bigasterisk.com
parents: 8
diff changeset
20 self.config['SSH_AUTH_SOCK'] = getSshAuthSock()
2c4d383d464c move config stuff into Project
drewp@bigasterisk.com
parents: 8
diff changeset
21
14
f83b7426b97c fix makeGithubRepo; use ssh_url for almost no benefit
drewp@bigasterisk.com <drewp@bigasterisk.com>
parents: 11
diff changeset
22 self.gh = Github(self.config['githubToken'])
7
7f479502a8ab wip sync_to_github (from hg)
drewp@bigasterisk.com
parents: 3
diff changeset
23 self.projRoot = projRoot
7f479502a8ab wip sync_to_github (from hg)
drewp@bigasterisk.com
parents: 3
diff changeset
24 self.name = projRoot.name
2
22ccc05756de don't waste time scanning repos that appear to have no recent activity
drewp@bigasterisk.com
parents: 1
diff changeset
25
22ccc05756de don't waste time scanning repos that appear to have no recent activity
drewp@bigasterisk.com
parents: 1
diff changeset
26 def darcsTime(self):
22ccc05756de don't waste time scanning repos that appear to have no recent activity
drewp@bigasterisk.com
parents: 1
diff changeset
27 j = os.path.join
22ccc05756de don't waste time scanning repos that appear to have no recent activity
drewp@bigasterisk.com
parents: 1
diff changeset
28 darcsPriv = j(self.config['darcsDir'], self.name, '_darcs')
22ccc05756de don't waste time scanning repos that appear to have no recent activity
drewp@bigasterisk.com
parents: 1
diff changeset
29 for n in ['inventory', 'hashed_inventory']:
22ccc05756de don't waste time scanning repos that appear to have no recent activity
drewp@bigasterisk.com
parents: 1
diff changeset
30 if os.path.exists(j(darcsPriv, n)):
22ccc05756de don't waste time scanning repos that appear to have no recent activity
drewp@bigasterisk.com
parents: 1
diff changeset
31 return os.path.getmtime(j(darcsPriv, n))
22ccc05756de don't waste time scanning repos that appear to have no recent activity
drewp@bigasterisk.com
parents: 1
diff changeset
32 raise ValueError("can't find a darcs time")
7
7f479502a8ab wip sync_to_github (from hg)
drewp@bigasterisk.com
parents: 3
diff changeset
33
0
drewp@bigasterisk.com
parents:
diff changeset
34 def gitDir(self):
drewp@bigasterisk.com
parents:
diff changeset
35 gitDir = os.path.join(self.config['gitSyncDir'], self.name)
drewp@bigasterisk.com
parents:
diff changeset
36 try:
drewp@bigasterisk.com
parents:
diff changeset
37 os.mkdir(gitDir)
15
d653e1b558ce rm dead code; reformat
drewp@bigasterisk.com <drewp@bigasterisk.com>
parents: 14
diff changeset
38 except OSError:
d653e1b558ce rm dead code; reformat
drewp@bigasterisk.com <drewp@bigasterisk.com>
parents: 14
diff changeset
39 pass
0
drewp@bigasterisk.com
parents:
diff changeset
40 return gitDir
7
7f479502a8ab wip sync_to_github (from hg)
drewp@bigasterisk.com
parents: 3
diff changeset
41
0
drewp@bigasterisk.com
parents:
diff changeset
42 def syncToLocalGit(self):
drewp@bigasterisk.com
parents:
diff changeset
43 darcsDir = os.path.join(self.config['darcsDir'], self.name)
drewp@bigasterisk.com
parents:
diff changeset
44 try:
drewp@bigasterisk.com
parents:
diff changeset
45 os.rmdir(os.path.join(darcsDir, 'darcs_testing_for_nfs'))
15
d653e1b558ce rm dead code; reformat
drewp@bigasterisk.com <drewp@bigasterisk.com>
parents: 14
diff changeset
46 except OSError:
d653e1b558ce rm dead code; reformat
drewp@bigasterisk.com <drewp@bigasterisk.com>
parents: 14
diff changeset
47 pass
3
4077903a9520 upgrade PyGithub. use keychain for ssh sock path
drewp@bigasterisk.com
parents: 2
diff changeset
48 self.runGitCommand([self.config['darcsToGitCmd'], '--verbose', darcsDir])
0
drewp@bigasterisk.com
parents:
diff changeset
49
7
7f479502a8ab wip sync_to_github (from hg)
drewp@bigasterisk.com
parents: 3
diff changeset
50 def runGitCommand(self, args, callKw={}):
1
1da34eecdfd8 port to PyGithub so repo creates work again
drewp@bigasterisk.com
parents: 0
diff changeset
51 try:
15
d653e1b558ce rm dead code; reformat
drewp@bigasterisk.com <drewp@bigasterisk.com>
parents: 14
diff changeset
52 subprocess.check_call(
d653e1b558ce rm dead code; reformat
drewp@bigasterisk.com <drewp@bigasterisk.com>
parents: 14
diff changeset
53 args,
d653e1b558ce rm dead code; reformat
drewp@bigasterisk.com <drewp@bigasterisk.com>
parents: 14
diff changeset
54 cwd=self.gitDir(),
d653e1b558ce rm dead code; reformat
drewp@bigasterisk.com <drewp@bigasterisk.com>
parents: 14
diff changeset
55 env={
d653e1b558ce rm dead code; reformat
drewp@bigasterisk.com <drewp@bigasterisk.com>
parents: 14
diff changeset
56 'SSH_AUTH_SOCK': self.config['SSH_AUTH_SOCK'],
d653e1b558ce rm dead code; reformat
drewp@bigasterisk.com <drewp@bigasterisk.com>
parents: 14
diff changeset
57 'HOME': os.environ['HOME'], # darcs-to-git uses this
d653e1b558ce rm dead code; reformat
drewp@bigasterisk.com <drewp@bigasterisk.com>
parents: 14
diff changeset
58 },
d653e1b558ce rm dead code; reformat
drewp@bigasterisk.com <drewp@bigasterisk.com>
parents: 14
diff changeset
59 **callKw)
1
1da34eecdfd8 port to PyGithub so repo creates work again
drewp@bigasterisk.com
parents: 0
diff changeset
60 except:
1da34eecdfd8 port to PyGithub so repo creates work again
drewp@bigasterisk.com
parents: 0
diff changeset
61 log.error("in %s" % self.gitDir())
1da34eecdfd8 port to PyGithub so repo creates work again
drewp@bigasterisk.com
parents: 0
diff changeset
62 raise
0
drewp@bigasterisk.com
parents:
diff changeset
63
8
cc3321b8adc1 fix silly case
drewp@bigasterisk.com
parents: 7
diff changeset
64 def makeGithubRepo(self):
0
drewp@bigasterisk.com
parents:
diff changeset
65 try:
14
f83b7426b97c fix makeGithubRepo; use ssh_url for almost no benefit
drewp@bigasterisk.com <drewp@bigasterisk.com>
parents: 11
diff changeset
66 self.gh.get_user().create_repo(self.name)
7
7f479502a8ab wip sync_to_github (from hg)
drewp@bigasterisk.com
parents: 3
diff changeset
67 except GithubException as e:
3
4077903a9520 upgrade PyGithub. use keychain for ssh sock path
drewp@bigasterisk.com
parents: 2
diff changeset
68 assert e.data['errors'][0]['message'].startswith('name already exists'), (e, self.name)
0
drewp@bigasterisk.com
parents:
diff changeset
69 return
15
d653e1b558ce rm dead code; reformat
drewp@bigasterisk.com <drewp@bigasterisk.com>
parents: 14
diff changeset
70
8
cc3321b8adc1 fix silly case
drewp@bigasterisk.com
parents: 7
diff changeset
71 def pushToGithub(self):
0
drewp@bigasterisk.com
parents:
diff changeset
72 self.runGitCommand(['git', 'push', 'origin', 'master'])
drewp@bigasterisk.com
parents:
diff changeset
73
8
cc3321b8adc1 fix silly case
drewp@bigasterisk.com
parents: 7
diff changeset
74 def hgToGithub(self):
15
d653e1b558ce rm dead code; reformat
drewp@bigasterisk.com <drewp@bigasterisk.com>
parents: 14
diff changeset
75 subprocess.check_call(['hg', 'bookmark', '-r', 'default', 'main'], cwd=self.projRoot)
14
f83b7426b97c fix makeGithubRepo; use ssh_url for almost no benefit
drewp@bigasterisk.com <drewp@bigasterisk.com>
parents: 11
diff changeset
76 repo = self.gh.get_user().get_repo(self.name)
15
d653e1b558ce rm dead code; reformat
drewp@bigasterisk.com <drewp@bigasterisk.com>
parents: 14
diff changeset
77 push = subprocess.run([
d653e1b558ce rm dead code; reformat
drewp@bigasterisk.com <drewp@bigasterisk.com>
parents: 14
diff changeset
78 'hg',
d653e1b558ce rm dead code; reformat
drewp@bigasterisk.com <drewp@bigasterisk.com>
parents: 14
diff changeset
79 'push',
d653e1b558ce rm dead code; reformat
drewp@bigasterisk.com <drewp@bigasterisk.com>
parents: 14
diff changeset
80 f'git+ssh://' + repo.ssh_url.replace(':', '/'),
d653e1b558ce rm dead code; reformat
drewp@bigasterisk.com <drewp@bigasterisk.com>
parents: 14
diff changeset
81 ],
10
460a2cf8b22b hg push fails upon success
drewp@bigasterisk.com
parents: 9
diff changeset
82 check=False,
460a2cf8b22b hg push fails upon success
drewp@bigasterisk.com
parents: 9
diff changeset
83 capture_output=True,
7
7f479502a8ab wip sync_to_github (from hg)
drewp@bigasterisk.com
parents: 3
diff changeset
84 cwd=self.projRoot,
7f479502a8ab wip sync_to_github (from hg)
drewp@bigasterisk.com
parents: 3
diff changeset
85 env={'SSH_AUTH_SOCK': self.config['SSH_AUTH_SOCK']})
11
19a699305c29 better failure erroring
drewp@bigasterisk.com
parents: 10
diff changeset
86 if push.returncode != 0 and not push.stdout.endswith(b'no changes found\n'):
10
460a2cf8b22b hg push fails upon success
drewp@bigasterisk.com
parents: 9
diff changeset
87 raise ValueError(f'hg push failed with {push.stdout!r}')
7
7f479502a8ab wip sync_to_github (from hg)
drewp@bigasterisk.com
parents: 3
diff changeset
88
15
d653e1b558ce rm dead code; reformat
drewp@bigasterisk.com <drewp@bigasterisk.com>
parents: 14
diff changeset
89
3
4077903a9520 upgrade PyGithub. use keychain for ssh sock path
drewp@bigasterisk.com
parents: 2
diff changeset
90 def getSshAuthSock():
15
d653e1b558ce rm dead code; reformat
drewp@bigasterisk.com <drewp@bigasterisk.com>
parents: 14
diff changeset
91 keychain = subprocess.check_output(["keychain", "--noask", "--quiet", "--eval", "id_rsa"]).decode('ascii')
3
4077903a9520 upgrade PyGithub. use keychain for ssh sock path
drewp@bigasterisk.com
parents: 2
diff changeset
92 m = re.search(r'SSH_AUTH_SOCK=([^; \n]+)', keychain)
7
7f479502a8ab wip sync_to_github (from hg)
drewp@bigasterisk.com
parents: 3
diff changeset
93 if m is None:
15
d653e1b558ce rm dead code; reformat
drewp@bigasterisk.com <drewp@bigasterisk.com>
parents: 14
diff changeset
94 raise ValueError("couldn't find SSH_AUTH_SOCK in output " "from keychain: %r" % keychain)
7
7f479502a8ab wip sync_to_github (from hg)
drewp@bigasterisk.com
parents: 3
diff changeset
95 return m.group(1)