summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMike Frysinger <vapier@google.com>2019-07-10 17:10:07 -0400
committerMike Frysinger <vapier@google.com>2019-10-01 05:39:27 +0000
commit369814b4a77adcc78b2549ad728e0d69175f08e8 (patch)
treeeccd05989cd69c424dce146b2ea76d0a7069b423
parente37aa5f331aa39776d5db1a1f816b66496f60e0c (diff)
downloadgit-repo-369814b4a77adcc78b2549ad728e0d69175f08e8.tar.gz
move UserAgent to git_command for wider user
We can't import the main module, so move the UserAgent helper out of it and into the git_command module so it can be used in more places. Bug: https://crbug.com/gerrit/11144 Change-Id: I8093c8a20bd1dc7d612d0e2a85180341817c0d86 Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/231057 Tested-by: Mike Frysinger <vapier@google.com> Reviewed-by: David Pursehouse <dpursehouse@collab.net>
-rw-r--r--git_command.py46
-rwxr-xr-xmain.py48
-rw-r--r--tests/test_git_command.py13
3 files changed, 62 insertions, 45 deletions
diff --git a/git_command.py b/git_command.py
index 67423035..32dcde09 100644
--- a/git_command.py
+++ b/git_command.py
@@ -98,6 +98,52 @@ class _GitCall(object):
98 return fun 98 return fun
99git = _GitCall() 99git = _GitCall()
100 100
101
102_user_agent = None
103
104def RepoUserAgent():
105 """Return a User-Agent string suitable for HTTP-like services.
106
107 We follow the style as documented here:
108 https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/User-Agent
109 """
110 global _user_agent
111
112 if _user_agent is None:
113 py_version = sys.version_info
114
115 os_name = sys.platform
116 if os_name == 'linux2':
117 os_name = 'Linux'
118 elif os_name == 'win32':
119 os_name = 'Win32'
120 elif os_name == 'cygwin':
121 os_name = 'Cygwin'
122 elif os_name == 'darwin':
123 os_name = 'Darwin'
124
125 p = GitCommand(
126 None, ['describe', 'HEAD'],
127 cwd=os.path.dirname(__file__),
128 capture_stdout=True)
129 if p.Wait() == 0:
130 repo_version = p.stdout
131 if repo_version and repo_version[-1] == '\n':
132 repo_version = repo_version[0:-1]
133 if repo_version and repo_version[0] == 'v':
134 repo_version = repo_version[1:]
135 else:
136 repo_version = 'unknown'
137
138 _user_agent = 'git-repo/%s (%s) git/%s Python/%d.%d.%d' % (
139 repo_version,
140 os_name,
141 git.version_tuple().full,
142 py_version.major, py_version.minor, py_version.micro)
143
144 return _user_agent
145
146
101def git_require(min_version, fail=False, msg=''): 147def git_require(min_version, fail=False, msg=''):
102 git_version = git.version_tuple() 148 git_version = git.version_tuple()
103 if min_version <= git_version: 149 if min_version <= git_version:
diff --git a/main.py b/main.py
index 2ab79b57..0b19aeb5 100755
--- a/main.py
+++ b/main.py
@@ -46,7 +46,7 @@ except ImportError:
46from color import SetDefaultColoring 46from color import SetDefaultColoring
47import event_log 47import event_log
48from repo_trace import SetTrace 48from repo_trace import SetTrace
49from git_command import git, GitCommand 49from git_command import git, GitCommand, RepoUserAgent
50from git_config import init_ssh, close_ssh 50from git_config import init_ssh, close_ssh
51from command import InteractiveCommand 51from command import InteractiveCommand
52from command import MirrorSafeCommand 52from command import MirrorSafeCommand
@@ -244,10 +244,6 @@ class _Repo(object):
244 return result 244 return result
245 245
246 246
247def _MyRepoPath():
248 return os.path.dirname(__file__)
249
250
251def _CheckWrapperVersion(ver, repo_path): 247def _CheckWrapperVersion(ver, repo_path):
252 if not repo_path: 248 if not repo_path:
253 repo_path = '~/bin/repo' 249 repo_path = '~/bin/repo'
@@ -299,51 +295,13 @@ def _PruneOptions(argv, opt):
299 continue 295 continue
300 i += 1 296 i += 1
301 297
302_user_agent = None
303
304def _UserAgent():
305 global _user_agent
306
307 if _user_agent is None:
308 py_version = sys.version_info
309
310 os_name = sys.platform
311 if os_name == 'linux2':
312 os_name = 'Linux'
313 elif os_name == 'win32':
314 os_name = 'Win32'
315 elif os_name == 'cygwin':
316 os_name = 'Cygwin'
317 elif os_name == 'darwin':
318 os_name = 'Darwin'
319
320 p = GitCommand(
321 None, ['describe', 'HEAD'],
322 cwd = _MyRepoPath(),
323 capture_stdout = True)
324 if p.Wait() == 0:
325 repo_version = p.stdout
326 if len(repo_version) > 0 and repo_version[-1] == '\n':
327 repo_version = repo_version[0:-1]
328 if len(repo_version) > 0 and repo_version[0] == 'v':
329 repo_version = repo_version[1:]
330 else:
331 repo_version = 'unknown'
332
333 _user_agent = 'git-repo/%s (%s) git/%s Python/%d.%d.%d' % (
334 repo_version,
335 os_name,
336 git.version_tuple().full,
337 py_version[0], py_version[1], py_version[2])
338 return _user_agent
339
340class _UserAgentHandler(urllib.request.BaseHandler): 298class _UserAgentHandler(urllib.request.BaseHandler):
341 def http_request(self, req): 299 def http_request(self, req):
342 req.add_header('User-Agent', _UserAgent()) 300 req.add_header('User-Agent', RepoUserAgent())
343 return req 301 return req
344 302
345 def https_request(self, req): 303 def https_request(self, req):
346 req.add_header('User-Agent', _UserAgent()) 304 req.add_header('User-Agent', RepoUserAgent())
347 return req 305 return req
348 306
349def _AddPasswordFromUserInput(handler, msg, req): 307def _AddPasswordFromUserInput(handler, msg, req):
diff --git a/tests/test_git_command.py b/tests/test_git_command.py
index 928eb402..4d65d3ce 100644
--- a/tests/test_git_command.py
+++ b/tests/test_git_command.py
@@ -18,6 +18,7 @@
18 18
19from __future__ import print_function 19from __future__ import print_function
20 20
21import re
21import unittest 22import unittest
22 23
23import git_command 24import git_command
@@ -47,3 +48,15 @@ class GitCallUnitTest(unittest.TestCase):
47 self.assertLess(ver, (9999, 9999, 9999)) 48 self.assertLess(ver, (9999, 9999, 9999))
48 49
49 self.assertNotEqual('', ver.full) 50 self.assertNotEqual('', ver.full)
51
52
53class RepoUserAgentUnitTest(unittest.TestCase):
54 """Tests the RepoUserAgent function."""
55
56 def test_smoke(self):
57 """Make sure it returns something useful."""
58 ua = git_command.RepoUserAgent()
59 # We can't dive too deep because of OS/tool differences, but we can check
60 # the general form.
61 m = re.match(r'^git-repo/[^ ]+ ([^ ]+) git/[^ ]+ Python/[0-9.]+', ua)
62 self.assertIsNotNone(m)