Show More
@@ -377,30 +377,6 b' def git_pre_receive(unused_repo_path, re' | |||||
377 | return _call_hook('pre_push', extras, GitMessageWriter()) |
|
377 | return _call_hook('pre_push', extras, GitMessageWriter()) | |
378 |
|
378 | |||
379 |
|
379 | |||
380 | def _run_command(arguments): |
|
|||
381 | """ |
|
|||
382 | Run the specified command and return the stdout. |
|
|||
383 |
|
||||
384 | :param arguments: sequence of program arguments (including the program name) |
|
|||
385 | :type arguments: list[str] |
|
|||
386 | """ |
|
|||
387 |
|
||||
388 | cmd = arguments |
|
|||
389 | try: |
|
|||
390 | gitenv = os.environ.copy() |
|
|||
391 | _opts = {'env': gitenv, 'shell': False, 'fail_on_stderr': False} |
|
|||
392 | p = subprocessio.SubprocessIOChunker(cmd, **_opts) |
|
|||
393 | stdout = ''.join(p) |
|
|||
394 | except (EnvironmentError, OSError) as err: |
|
|||
395 | cmd = ' '.join(cmd) # human friendly CMD |
|
|||
396 | tb_err = ("Couldn't run git command (%s).\n" |
|
|||
397 | "Original error was:%s\n" % (cmd, err)) |
|
|||
398 | log.exception(tb_err) |
|
|||
399 | raise Exception(tb_err) |
|
|||
400 |
|
||||
401 | return stdout |
|
|||
402 |
|
||||
403 |
|
||||
404 | def git_post_receive(unused_repo_path, revision_lines, env): |
|
380 | def git_post_receive(unused_repo_path, revision_lines, env): | |
405 | """ |
|
381 | """ | |
406 | Post push hook. |
|
382 | Post push hook. | |
@@ -437,21 +413,26 b' def git_post_receive(unused_repo_path, r' | |||||
437 | # Fix up head revision if needed |
|
413 | # Fix up head revision if needed | |
438 | cmd = [settings.GIT_EXECUTABLE, 'show', 'HEAD'] |
|
414 | cmd = [settings.GIT_EXECUTABLE, 'show', 'HEAD'] | |
439 | try: |
|
415 | try: | |
440 |
|
|
416 | subprocessio.run_command(cmd, env=os.environ.copy()) | |
441 | except Exception: |
|
417 | except Exception: | |
442 | cmd = [settings.GIT_EXECUTABLE, 'symbolic-ref', 'HEAD', |
|
418 | cmd = [settings.GIT_EXECUTABLE, 'symbolic-ref', 'HEAD', | |
443 | 'refs/heads/%s' % push_ref['name']] |
|
419 | 'refs/heads/%s' % push_ref['name']] | |
444 | print("Setting default branch to %s" % push_ref['name']) |
|
420 | print("Setting default branch to %s" % push_ref['name']) | |
445 |
|
|
421 | subprocessio.run_command(cmd, env=os.environ.copy()) | |
446 |
|
422 | |||
447 |
cmd = [settings.GIT_EXECUTABLE, 'for-each-ref', |
|
423 | cmd = [settings.GIT_EXECUTABLE, 'for-each-ref', | |
448 | 'refs/heads/*'] |
|
424 | '--format=%(refname)', 'refs/heads/*'] | |
449 |
|
|
425 | stdout, stderr = subprocessio.run_command( | |
|
426 | cmd, env=os.environ.copy()) | |||
|
427 | heads = stdout | |||
450 | heads = heads.replace(push_ref['ref'], '') |
|
428 | heads = heads.replace(push_ref['ref'], '') | |
451 | heads = ' '.join(head for head in heads.splitlines() if head) |
|
429 | heads = ' '.join(head for head in heads.splitlines() if head) | |
452 |
cmd = [settings.GIT_EXECUTABLE, 'log', '--reverse', |
|
430 | cmd = [settings.GIT_EXECUTABLE, 'log', '--reverse', | |
453 |
'--', push_ref['new_rev'], |
|
431 | '--pretty=format:%H', '--', push_ref['new_rev'], | |
454 | git_revs.extend(_run_command(cmd).splitlines()) |
|
432 | '--not', heads] | |
|
433 | stdout, stderr = subprocessio.run_command( | |||
|
434 | cmd, env=os.environ.copy()) | |||
|
435 | git_revs.extend(stdout.splitlines()) | |||
455 | elif push_ref['new_rev'] == empty_commit_id: |
|
436 | elif push_ref['new_rev'] == empty_commit_id: | |
456 | # delete branch case |
|
437 | # delete branch case | |
457 | git_revs.append('delete_branch=>%s' % push_ref['name']) |
|
438 | git_revs.append('delete_branch=>%s' % push_ref['name']) | |
@@ -462,7 +443,9 b' def git_post_receive(unused_repo_path, r' | |||||
462 | cmd = [settings.GIT_EXECUTABLE, 'log', |
|
443 | cmd = [settings.GIT_EXECUTABLE, 'log', | |
463 | '{old_rev}..{new_rev}'.format(**push_ref), |
|
444 | '{old_rev}..{new_rev}'.format(**push_ref), | |
464 | '--reverse', '--pretty=format:%H'] |
|
445 | '--reverse', '--pretty=format:%H'] | |
465 | git_revs.extend(_run_command(cmd).splitlines()) |
|
446 | stdout, stderr = subprocessio.run_command( | |
|
447 | cmd, env=os.environ.copy()) | |||
|
448 | git_revs.extend(stdout.splitlines()) | |||
466 | elif type_ == 'tags': |
|
449 | elif type_ == 'tags': | |
467 | if push_ref['name'] not in tags: |
|
450 | if push_ref['name'] not in tags: | |
468 | tags.append(push_ref['name']) |
|
451 | tags.append(push_ref['name']) |
@@ -482,3 +482,30 b' class SubprocessIOChunker(object):' | |||||
482 |
|
482 | |||
483 | def __del__(self): |
|
483 | def __del__(self): | |
484 | self.close() |
|
484 | self.close() | |
|
485 | ||||
|
486 | ||||
|
487 | def run_command(arguments, env=None): | |||
|
488 | """ | |||
|
489 | Run the specified command and return the stdout. | |||
|
490 | ||||
|
491 | :param arguments: sequence of program arguments (including the program name) | |||
|
492 | :type arguments: list[str] | |||
|
493 | """ | |||
|
494 | ||||
|
495 | cmd = arguments | |||
|
496 | log.debug('Running subprocessio command %s', cmd) | |||
|
497 | try: | |||
|
498 | _opts = {'shell': False, 'fail_on_stderr': False} | |||
|
499 | if env: | |||
|
500 | _opts.update({'env': env}) | |||
|
501 | p = SubprocessIOChunker(cmd, **_opts) | |||
|
502 | stdout = ''.join(p) | |||
|
503 | stderr = ''.join(''.join(p.error)) | |||
|
504 | except (EnvironmentError, OSError) as err: | |||
|
505 | cmd = ' '.join(cmd) # human friendly CMD | |||
|
506 | tb_err = ("Couldn't run subprocessio command (%s).\n" | |||
|
507 | "Original error was:%s\n" % (cmd, err)) | |||
|
508 | log.exception(tb_err) | |||
|
509 | raise Exception(tb_err) | |||
|
510 | ||||
|
511 | return stdout, stderr |
@@ -22,7 +22,6 b' from urllib2 import URLError' | |||||
22 | import logging |
|
22 | import logging | |
23 | import posixpath as vcspath |
|
23 | import posixpath as vcspath | |
24 | import StringIO |
|
24 | import StringIO | |
25 | import subprocess |
|
|||
26 | import urllib |
|
25 | import urllib | |
27 | import traceback |
|
26 | import traceback | |
28 |
|
27 | |||
@@ -33,11 +32,9 b' import svn.diff' | |||||
33 | import svn.fs |
|
32 | import svn.fs | |
34 | import svn.repos |
|
33 | import svn.repos | |
35 |
|
34 | |||
36 | from vcsserver import svn_diff |
|
35 | from vcsserver import svn_diff, exceptions, subprocessio | |
37 | from vcsserver import exceptions |
|
|||
38 | from vcsserver.base import RepoFactory, raise_from_original |
|
36 | from vcsserver.base import RepoFactory, raise_from_original | |
39 |
|
37 | |||
40 |
|
||||
41 | log = logging.getLogger(__name__) |
|
38 | log = logging.getLogger(__name__) | |
42 |
|
39 | |||
43 |
|
40 | |||
@@ -164,10 +161,9 b' class SvnRemote(object):' | |||||
164 | raise Exception( |
|
161 | raise Exception( | |
165 | "Path %s is not a valid Subversion repository." % repo_path) |
|
162 | "Path %s is not a valid Subversion repository." % repo_path) | |
166 |
|
163 | |||
167 | load = subprocess.Popen( |
|
164 | cmd = ['svnadmin', 'info', repo_path] | |
168 | ['svnadmin', 'info', repo_path], |
|
165 | stdout, stderr = subprocessio.run_command(cmd) | |
169 | stdout=subprocess.PIPE, stderr=subprocess.PIPE) |
|
166 | return stdout | |
170 | return ''.join(load.stdout) |
|
|||
171 |
|
167 | |||
172 | def lookup(self, wire, revision): |
|
168 | def lookup(self, wire, revision): | |
173 | if revision not in [-1, None, 'HEAD']: |
|
169 | if revision not in [-1, None, 'HEAD']: | |
@@ -343,7 +339,9 b' class SvnRemote(object):' | |||||
343 | if not self.is_path_valid_repository(wire, repo_path): |
|
339 | if not self.is_path_valid_repository(wire, repo_path): | |
344 | raise Exception( |
|
340 | raise Exception( | |
345 | "Path %s is not a valid Subversion repository." % repo_path) |
|
341 | "Path %s is not a valid Subversion repository." % repo_path) | |
|
342 | ||||
346 | # TODO: johbo: URL checks ? |
|
343 | # TODO: johbo: URL checks ? | |
|
344 | import subprocess | |||
347 | rdump = subprocess.Popen( |
|
345 | rdump = subprocess.Popen( | |
348 | ['svnrdump', 'dump', '--non-interactive', src_url], |
|
346 | ['svnrdump', 'dump', '--non-interactive', src_url], | |
349 | stdout=subprocess.PIPE, stderr=subprocess.PIPE) |
|
347 | stdout=subprocess.PIPE, stderr=subprocess.PIPE) |
General Comments 0
You need to be logged in to leave comments.
Login now